詳解C++ 存儲二進(jìn)制數(shù)據(jù)容器的幾種方法
1.std::vector<uint8_t>(最常用)
std::vector 是動(dòng)態(tài)數(shù)組容器,搭配 uint8_t(無符號8位整數(shù),即1字節(jié))是存儲二進(jìn)制數(shù)據(jù)的首選方案,尤其適合長度不確定的二進(jìn)制流(如文件內(nèi)容、網(wǎng)絡(luò)數(shù)據(jù)包)。
特點(diǎn):
- 動(dòng)態(tài)大小:可隨數(shù)據(jù)量自動(dòng)擴(kuò)容,支持
push_back、resize等操作,靈活處理變長二進(jìn)制數(shù)據(jù)。 - 連續(xù)內(nèi)存:元素在內(nèi)存中連續(xù)存儲,可通過
data()方法獲取原始字節(jié)指針(uint8_t*),方便與 C 風(fēng)格接口(如系統(tǒng)調(diào)用、網(wǎng)絡(luò)函數(shù))交互。 - C++11 增強(qiáng):支持移動(dòng)語義(
std::move),避免大二進(jìn)制數(shù)據(jù)的拷貝開銷;支持初始化列表({0x01, 0x02, 0x03})快速初始化。
適用場景:
- 讀取文件二進(jìn)制內(nèi)容(如圖片、音頻)。
- 網(wǎng)絡(luò)通信中的緩沖區(qū)(發(fā)送/接收字節(jié)流)。
- 動(dòng)態(tài)生成的二進(jìn)制數(shù)據(jù)(如加密后的字節(jié)序列)。
示例:
#include <vector>
#include <cstdint> // 包含uint8_t
int main() {
// 存儲二進(jìn)制數(shù)據(jù)(例如一個(gè)簡單的協(xié)議包)
std::vector<uint8_t> binary_data = {0x01, 0x02, 0xFF, 0x00};
// 動(dòng)態(tài)添加數(shù)據(jù)
binary_data.push_back(0x03);
// 獲取原始字節(jié)指針,用于C風(fēng)格接口
uint8_t* raw_ptr = binary_data.data();
size_t size = binary_data.size(); // 字節(jié)數(shù):5
return 0;
}
2.std::array<uint8_t, N>(固定大小二進(jìn)制數(shù)據(jù))
std::array 是 C++11 新增的固定大小數(shù)組容器,適合存儲長度已知且固定的二進(jìn)制數(shù)據(jù)(如協(xié)議頭、固定大小的校驗(yàn)碼)。
特點(diǎn):
- 編譯期固定大小:聲明時(shí)需指定長度(如
std::array<uint8_t, 16>表示16字節(jié)),內(nèi)存分配在棧上(或靜態(tài)區(qū)),無需動(dòng)態(tài)內(nèi)存管理。 - 連續(xù)內(nèi)存:同
vector,支持data()獲取原始指針,性能優(yōu)于動(dòng)態(tài)數(shù)組。 - 無額外開銷:相比
vector沒有動(dòng)態(tài)擴(kuò)容的額外內(nèi)存(如容量管理的指針),空間效率更高。
適用場景:
- 固定格式的二進(jìn)制協(xié)議頭(如16字節(jié)的TCP頭部部分字段)。
- 哈希值、UUID等固定長度的二進(jìn)制數(shù)據(jù)(如16字節(jié)的MD5結(jié)果)。
- 嵌入式系統(tǒng)中對內(nèi)存分配有嚴(yán)格限制的場景。
示例:
#include <array>
#include <cstdint>
int main() {
// 存儲16字節(jié)的固定二進(jìn)制數(shù)據(jù)(如UUID)
std::array<uint8_t, 16> uuid = {
0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF
};
// 訪問單個(gè)字節(jié)
uint8_t first_byte = uuid[0]; // 0x00
return 0;
}
3.std::string(兼容字符串操作的二進(jìn)制數(shù)據(jù))
std::string 本質(zhì)是“字節(jié)序列容器”(C++標(biāo)準(zhǔn)未限制必須是字符串),可存儲包含空字符(\0)的二進(jìn)制數(shù)據(jù),適合需要同時(shí)支持字符串操作和二進(jìn)制存儲的場景。
特點(diǎn):
- 兼容字符串API:可使用
substr、find等方法處理二進(jìn)制數(shù)據(jù)中的片段,方便解析包含文本標(biāo)識的二進(jìn)制流(如HTTP協(xié)議中的二進(jìn)制附件)。 - 連續(xù)內(nèi)存:支持
data()或c_str()獲取字節(jié)指針(注意c_str()會(huì)在末尾附加\0,但data()在C++11中與c_str()等效,需謹(jǐn)慎處理)。 - 注意事項(xiàng):二進(jìn)制數(shù)據(jù)中的
\0不會(huì)被視為“結(jié)束符”,size()方法會(huì)返回真實(shí)字節(jié)數(shù)(包含\0)。
適用場景:
- 存儲包含文本和二進(jìn)制混合的數(shù)據(jù)(如郵件中的MIME附件)。
- 需要對二進(jìn)制數(shù)據(jù)進(jìn)行子串查找、拼接等操作的場景。
示例:
#include <string>
#include <cstdint>
int main() {
// 存儲包含空字符的二進(jìn)制數(shù)據(jù)
std::string binary_str;
binary_str += static_cast<char>(0x01);
binary_str += static_cast<char>(0x00); // 空字符,仍會(huì)被計(jì)入長度
binary_str += static_cast<char>(0x02);
std::cout << "長度:" << binary_str.size(); // 輸出3(包含空字符)
return 0;
}
4.std::bitset<N>(固定大小比特序列)
std::bitset 用于存儲固定長度的比特(bit)序列(而非字節(jié)),適合需要精確控制每一個(gè)比特的場景(如標(biāo)志位、壓縮存儲布爾值)。
特點(diǎn):
- 比特級操作:支持單個(gè)比特的設(shè)置(
set)、清空(reset)、翻轉(zhuǎn)(flip),以及批量邏輯運(yùn)算(與、或、異或)。 - 編譯期固定大小:長度
N必須是編譯期常量(如std::bitset<32>表示32個(gè)比特)。 - 空間高效:每個(gè)比特僅占1/8字節(jié),比
vector<bool>更高效(無額外指針開銷)。
適用場景:
- 存儲大量布爾標(biāo)志(如32個(gè)狀態(tài)標(biāo)志僅需4字節(jié))。
- 協(xié)議中的比特位字段(如TCP頭部的控制位:SYN、ACK等)。
- 比特級算法(如位掩碼、壓縮算法)。
示例:
#include <bitset>
int main() {
// 32位比特序列,存儲標(biāo)志位
std::bitset<32> flags;
// 設(shè)置第0位和第2位(從0開始)
flags.set(0);
flags.set(2);
// 檢查第0位是否為1
bool is_set = flags.test(0); // true
// 整體轉(zhuǎn)換為整數(shù)(獲取比特序列的數(shù)值)
uint32_t value = flags.to_ulong(); // 二進(jìn)制101 → 十進(jìn)制5
return 0;
}
5.std::vector<bool>(動(dòng)態(tài)比特序列)
std::vector<bool> 是 vector 的特化版本,用于存儲動(dòng)態(tài)長度的比特序列,本質(zhì)是“比特容器”(每個(gè)元素占1比特)。
特點(diǎn):
- 動(dòng)態(tài)大小:長度可在運(yùn)行時(shí)調(diào)整(如
push_back添加比特),適合比特?cái)?shù)不確定的場景。 - 空間優(yōu)化:比
vector<uint8_t>節(jié)省空間(存儲1000個(gè)布爾值僅需約125字節(jié))。 - 注意事項(xiàng):迭代器行為特殊(返回代理對象而非直接引用),部分操作效率可能低于
std::bitset或vector<uint8_t>。
適用場景:
- 動(dòng)態(tài)生成的比特流(如編碼算法輸出的可變長度比特序列)。
- 存儲數(shù)量不確定的布爾狀態(tài)(如動(dòng)態(tài)篩選結(jié)果的標(biāo)志)。
示例:
#include <vector>
int main() {
// 動(dòng)態(tài)比特序列
std::vector<bool> bits;
// 添加比特
bits.push_back(true); // 第0位:1
bits.push_back(false); // 第1位:0
bits.push_back(true); // 第2位:1
// 訪問第2位
bool bit2 = bits[2]; // true
return 0;
}
總結(jié)
C++ 中存儲二進(jìn)制數(shù)據(jù)的核心選擇及適用場景:
| 數(shù)據(jù)結(jié)構(gòu) | 存儲單位 | 大小特性 | 核心優(yōu)勢 | 適用場景 |
|---|---|---|---|---|
| std::vector<uint8_t> | 字節(jié) | 動(dòng)態(tài)大小 | 靈活、連續(xù)內(nèi)存、適合變長數(shù)據(jù) | 網(wǎng)絡(luò)緩沖區(qū)、文件內(nèi)容、動(dòng)態(tài)字節(jié)流 |
| std::array<uint8_t, N> | 字節(jié) | 固定大小(編譯期) | 無動(dòng)態(tài)開銷、棧上分配 | 協(xié)議頭、固定長度哈希/UUID |
| std::string | 字節(jié) | 動(dòng)態(tài)大小 | 兼容字符串操作,支持混合數(shù)據(jù) | 文本+二進(jìn)制混合數(shù)據(jù)、帶標(biāo)識的字節(jié)流 |
| std::bitset<N> | 比特 | 固定大?。ň幾g期) | 高效比特操作、空間緊湊 | 標(biāo)志位、固定長度比特字段 |
| std::vector<bool> | 比特 | 動(dòng)態(tài)大小 | 動(dòng)態(tài)調(diào)整比特?cái)?shù),空間優(yōu)化 | 變長比特流、動(dòng)態(tài)布爾狀態(tài)集合 |
根據(jù)需求選擇:動(dòng)態(tài)字節(jié)流優(yōu)先用 vector<uint8_t>,固定字節(jié)用 array,比特級操作選 bitset 或 vector<bool>,混合文本和二進(jìn)制用 std::string。
到此這篇關(guān)于詳解C++ 存儲二進(jìn)制數(shù)據(jù)容器的幾種方法的文章就介紹到這了,更多相關(guān)C++ 存儲二進(jìn)制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C++中幾種將整數(shù)轉(zhuǎn)換成二進(jìn)制輸出的方法總結(jié)
- C++實(shí)現(xiàn)string存取二進(jìn)制數(shù)據(jù)的方法
- C++ 十進(jìn)制轉(zhuǎn)換為二進(jìn)制的實(shí)例代碼
- C++實(shí)現(xiàn)讀入二進(jìn)制數(shù)并轉(zhuǎn)換為十進(jìn)制輸出
- 詳解C++編程中對二進(jìn)制文件的讀寫操作
- C++實(shí)現(xiàn)十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)的數(shù)學(xué)算法
- c++ 一個(gè)二進(jìn)制串轉(zhuǎn)化為整數(shù)的解決方法
- C++二進(jìn)制翻轉(zhuǎn)實(shí)例分析
- C++如何計(jì)算二進(jìn)制數(shù)中1的個(gè)數(shù)
相關(guān)文章
C++簡單實(shí)現(xiàn)shared_ptr的代碼
智能指針用于資源管理,為了保證資源的操作得到順利的執(zhí)行防止資源泄露,因此大多數(shù)實(shí)現(xiàn)都以noexcept在參數(shù)列表后聲明為不拋出異常,這篇文章主要介紹了C++簡單實(shí)現(xiàn)shared_ptr的代碼,需要的朋友可以參考下2022-09-09
非常漂亮的新年祝福!C語言實(shí)現(xiàn)漂亮的煙花效果
非常漂亮的新年祝福!這篇文章主要介紹了C語言實(shí)現(xiàn)漂亮的煙花效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02
C++實(shí)現(xiàn)線性表有序表的合并方式(順序表實(shí)現(xiàn)and鏈表實(shí)現(xiàn))
這篇文章主要介紹了C++實(shí)現(xiàn)線性表有序表的合并方式(順序表實(shí)現(xiàn)and鏈表實(shí)現(xiàn)),具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04

