Boost

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。

發佈了24 篇原創文章 · 獲贊 12 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章