Boost
Boost 是一個功能強大、構造精巧、跨平臺、開源並且完全免費的 C++ 程序庫。C++11 標準庫中有三分之二來自 Boost 庫,Boost 庫建立在“既有的實踐”之上並提供參考實現,大大增強了 C++ 的功能和表現力。
安裝 Boost 庫
- 官網下載 Boost 源碼壓縮包
tar -jxvf boost_1_69_0.tar.gz2
,解壓。./bootstrap.sh
,編譯前配置工作。sudo ./b2 install
,正式編譯並安裝,也可以分爲兩步:./b2
,編譯。sudo ./b2 install
,安裝。
相關頭文件被默認安裝在/usr/local/include
中,相關庫文件默認安裝在/usr/local/lib
中。
Boost 庫大多數組件不需要編譯鏈接,在自己的源碼中直接包含頭文件即可。剩下的少量庫(如 thread,date_time)必須編譯成靜態庫或者動態庫,並在構建時指定鏈接選項。
使用 Boost 庫
使用非編譯庫
大多數庫均爲非編譯庫,直接在源代碼中包含相應的頭文件即可。
編譯命令爲g++ demo.cpp
#include <boost/version.hpp>
#include <boost/config.hpp>
#include <iostream>
using namespace std;
int main()
{
cout<< BOOST_VERSION<<endl; //版本號
cout<< BOOST_LIB_VERSION<<endl;
cout<< BOOST_PLATFORM<<endl; //操作系統
cout<< BOOST_COMPILER<<endl;
cout<< BOOST_STDLIB<<endl;
return 0;
}
使用編譯庫
對於有少量的 Boost 庫,是必須在編譯時指定對應的鏈接選項的,如boost_system, pthread
等,相關的需要編譯的庫可以使用命令./bootstrap.sh --show-libraries
查看。
編譯命令爲g++ demo.cpp -l編譯庫名
#include <iostream>
#include <thread>
using namespace std;
void func(int num)
{
while (true)
{
cout << num << endl;
}
}
int main()
{
thread t1(func, 1);
thread t2(func, 2);
t1.join();
t2.join();
return 0;
}
Base64 編解碼
Base64 是一種用 64 個字符來表示任意二進制數據的方法。在用記事本打開 exe、jpg、pdf 這些文件時,會看到一大堆亂碼,這是因爲二進制文件包含很多無法顯示和打印的字符,所以如果要讓記事本這樣的文本處理軟件能處理二進制數據,就需要一個二進制到字符串的轉換方法。
Base64 是一種最常見的二進制編碼方法,它是一種基於 64 個可打印字符來表示二進制數據的表示方法,從本質上看 Base64 編碼就是將三字節轉四字節(將原來字符的二進制編碼重新進行 6 位一編碼,而不是 8 位一編碼),長度增加 33%,如果數據的長度不是 3 的整數倍,就要在後面補 0 再計算,每補 2 個 0 就在 Base64 串後加上 1 個=
,可以理解最多增加 4 個 0,即 2 個=
。雖然數據長度增加了,但是編碼後的文本數據可以直接顯示。
由於 boost 庫良好的封裝,所以使用 boost 來完成 Base64 編碼解碼非常方便,如下。
/**
* base64編碼算法
* 輸入:data,待編碼數據
* 輸出:data被base64編碼後的字符串。"KuSCRlicg30QVTChBdToXlYhREDPxdkDiKNgfHYiDWU="
*/
std::string get_base64_encode(const std::string &data)
{
typedef boost::archive::iterators::base64_from_binary<boost::archive::iterators::transform_width<std::string::const_iterator, 6, 8>> Base64EncodeIterator;
std::stringstream result;
std::copy(Base64EncodeIterator(data.begin()), Base64EncodeIterator(data.end()), std::ostream_iterator<char>(result));
size_t equal_count = (3 - data.length() % 3) % 3;
for (size_t i = 0; i < equal_count; i++)
{
result.put('=');
}
return result.str();
}
/**
* base64解碼算法
* 輸入:data,待解碼數據
* 輸出:data被base64解碼後的字符串
*/
std::string get_base64_decode(const std::string &data)
{
typedef boost::archive::iterators::transform_width<boost::archive::iterators::binary_from_base64<std::string::const_iterator>, 8, 6> Base64DecodeIterator;
std::stringstream result;
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// Base64編碼原理是把3字節的二進制數據編碼爲4字節的文本數據,長度增加33%。
// 如果要編碼的二進制數據不是3的倍數,會在最後剩下1個或2個字節用\x00字節在末尾補足,然後在編碼的末尾加上1個或2個=號。
// 所以在Base64解碼中會將=號解碼爲\0,這對文本無影響,但是對音頻,圖像等其他二進制數據有影響,所以需要手動將=去除再解碼。
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
std::string temp = data;
while (temp[temp.size() - 1] == '=')
{
temp.erase(temp.size() - 1);
}
std::copy(Base64DecodeIterator(temp.begin()), Base64DecodeIterator(temp.end()), std::ostream_iterator<char>(result));
return result.str();
}
在 decode 的時候,得出的解碼後的 string 的 size 有的時候會比源多一個或兩個長度,並且爲\0。這是因爲如果要編碼的二進制數據不是 3 的倍數,會在最後剩下 1 個或 2 個字節用\x00 字節在末尾補足,然後在編碼的末尾加上 1 個或 2 個=號。在編碼時,補的=號會被解碼爲\0。