詳解C++ 存儲(chǔ)二進(jìn)制數(shù)據(jù)容器的幾種方法
1.std::vector<uint8_t>(最常用)
std::vector 是動(dòng)態(tài)數(shù)組容器,搭配 uint8_t(無(wú)符號(hào)8位整數(shù),即1字節(jié))是存儲(chǔ)二進(jìn)制數(shù)據(jù)的首選方案,尤其適合長(zhǎng)度不確定的二進(jìn)制流(如文件內(nèi)容、網(wǎng)絡(luò)數(shù)據(jù)包)。
特點(diǎn):
- 動(dòng)態(tài)大小:可隨數(shù)據(jù)量自動(dòng)擴(kuò)容,支持
push_back、resize等操作,靈活處理變長(zhǎng)二進(jìn)制數(shù)據(jù)。 - 連續(xù)內(nèi)存:元素在內(nèi)存中連續(xù)存儲(chǔ),可通過(guò)
data()方法獲取原始字節(jié)指針(uint8_t*),方便與 C 風(fēng)格接口(如系統(tǒng)調(diào)用、網(wǎng)絡(luò)函數(shù))交互。 - C++11 增強(qiáng):支持移動(dòng)語(yǔ)義(
std::move),避免大二進(jìn)制數(shù)據(jù)的拷貝開(kāi)銷(xiāo);支持初始化列表({0x01, 0x02, 0x03})快速初始化。
適用場(chǎng)景:
- 讀取文件二進(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() {
// 存儲(chǔ)二進(jìn)制數(shù)據(jù)(例如一個(gè)簡(jiǎn)單的協(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ù)組容器,適合存儲(chǔ)長(zhǎng)度已知且固定的二進(jìn)制數(shù)據(jù)(如協(xié)議頭、固定大小的校驗(yàn)碼)。
特點(diǎn):
- 編譯期固定大小:聲明時(shí)需指定長(zhǎng)度(如
std::array<uint8_t, 16>表示16字節(jié)),內(nèi)存分配在棧上(或靜態(tài)區(qū)),無(wú)需動(dòng)態(tài)內(nèi)存管理。 - 連續(xù)內(nèi)存:同
vector,支持data()獲取原始指針,性能優(yōu)于動(dòng)態(tài)數(shù)組。 - 無(wú)額外開(kāi)銷(xiāo):相比
vector沒(méi)有動(dòng)態(tài)擴(kuò)容的額外內(nèi)存(如容量管理的指針),空間效率更高。
適用場(chǎng)景:
- 固定格式的二進(jìn)制協(xié)議頭(如16字節(jié)的TCP頭部部分字段)。
- 哈希值、UUID等固定長(zhǎng)度的二進(jìn)制數(shù)據(jù)(如16字節(jié)的MD5結(jié)果)。
- 嵌入式系統(tǒng)中對(duì)內(nèi)存分配有嚴(yán)格限制的場(chǎng)景。
示例:
#include <array>
#include <cstdint>
int main() {
// 存儲(chǔ)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
};
// 訪問(wèn)單個(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)未限制必須是字符串),可存儲(chǔ)包含空字符(\0)的二進(jìn)制數(shù)據(jù),適合需要同時(shí)支持字符串操作和二進(jìn)制存儲(chǔ)的場(chǎng)景。
特點(diǎn):
- 兼容字符串API:可使用
substr、find等方法處理二進(jìn)制數(shù)據(jù)中的片段,方便解析包含文本標(biāo)識(shí)的二進(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)。
適用場(chǎng)景:
- 存儲(chǔ)包含文本和二進(jìn)制混合的數(shù)據(jù)(如郵件中的MIME附件)。
- 需要對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行子串查找、拼接等操作的場(chǎng)景。
示例:
#include <string>
#include <cstdint>
int main() {
// 存儲(chǔ)包含空字符的二進(jìn)制數(shù)據(jù)
std::string binary_str;
binary_str += static_cast<char>(0x01);
binary_str += static_cast<char>(0x00); // 空字符,仍會(huì)被計(jì)入長(zhǎng)度
binary_str += static_cast<char>(0x02);
std::cout << "長(zhǎng)度:" << binary_str.size(); // 輸出3(包含空字符)
return 0;
}
4.std::bitset<N>(固定大小比特序列)
std::bitset 用于存儲(chǔ)固定長(zhǎng)度的比特(bit)序列(而非字節(jié)),適合需要精確控制每一個(gè)比特的場(chǎng)景(如標(biāo)志位、壓縮存儲(chǔ)布爾值)。
特點(diǎn):
- 比特級(jí)操作:支持單個(gè)比特的設(shè)置(
set)、清空(reset)、翻轉(zhuǎn)(flip),以及批量邏輯運(yùn)算(與、或、異或)。 - 編譯期固定大小:長(zhǎng)度
N必須是編譯期常量(如std::bitset<32>表示32個(gè)比特)。 - 空間高效:每個(gè)比特僅占1/8字節(jié),比
vector<bool>更高效(無(wú)額外指針開(kāi)銷(xiāo))。
適用場(chǎng)景:
- 存儲(chǔ)大量布爾標(biāo)志(如32個(gè)狀態(tài)標(biāo)志僅需4字節(jié))。
- 協(xié)議中的比特位字段(如TCP頭部的控制位:SYN、ACK等)。
- 比特級(jí)算法(如位掩碼、壓縮算法)。
示例:
#include <bitset>
int main() {
// 32位比特序列,存儲(chǔ)標(biāo)志位
std::bitset<32> flags;
// 設(shè)置第0位和第2位(從0開(kāi)始)
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 的特化版本,用于存儲(chǔ)動(dòng)態(tài)長(zhǎng)度的比特序列,本質(zhì)是“比特容器”(每個(gè)元素占1比特)。
特點(diǎn):
- 動(dòng)態(tài)大小:長(zhǎng)度可在運(yùn)行時(shí)調(diào)整(如
push_back添加比特),適合比特?cái)?shù)不確定的場(chǎng)景。 - 空間優(yōu)化:比
vector<uint8_t>節(jié)省空間(存儲(chǔ)1000個(gè)布爾值僅需約125字節(jié))。 - 注意事項(xiàng):迭代器行為特殊(返回代理對(duì)象而非直接引用),部分操作效率可能低于
std::bitset或vector<uint8_t>。
適用場(chǎng)景:
- 動(dòng)態(tài)生成的比特流(如編碼算法輸出的可變長(zhǎng)度比特序列)。
- 存儲(chǔ)數(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
// 訪問(wèn)第2位
bool bit2 = bits[2]; // true
return 0;
}
總結(jié)
C++ 中存儲(chǔ)二進(jìn)制數(shù)據(jù)的核心選擇及適用場(chǎng)景:
| 數(shù)據(jù)結(jié)構(gòu) | 存儲(chǔ)單位 | 大小特性 | 核心優(yōu)勢(shì) | 適用場(chǎng)景 |
|---|---|---|---|---|
| std::vector<uint8_t> | 字節(jié) | 動(dòng)態(tài)大小 | 靈活、連續(xù)內(nèi)存、適合變長(zhǎng)數(shù)據(jù) | 網(wǎng)絡(luò)緩沖區(qū)、文件內(nèi)容、動(dòng)態(tài)字節(jié)流 |
| std::array<uint8_t, N> | 字節(jié) | 固定大?。ň幾g期) | 無(wú)動(dòng)態(tài)開(kāi)銷(xiāo)、棧上分配 | 協(xié)議頭、固定長(zhǎng)度哈希/UUID |
| std::string | 字節(jié) | 動(dòng)態(tài)大小 | 兼容字符串操作,支持混合數(shù)據(jù) | 文本+二進(jìn)制混合數(shù)據(jù)、帶標(biāo)識(shí)的字節(jié)流 |
| std::bitset<N> | 比特 | 固定大?。ň幾g期) | 高效比特操作、空間緊湊 | 標(biāo)志位、固定長(zhǎng)度比特字段 |
| std::vector<bool> | 比特 | 動(dòng)態(tài)大小 | 動(dòng)態(tài)調(diào)整比特?cái)?shù),空間優(yōu)化 | 變長(zhǎng)比特流、動(dòng)態(tài)布爾狀態(tài)集合 |
根據(jù)需求選擇:動(dòng)態(tài)字節(jié)流優(yōu)先用 vector<uint8_t>,固定字節(jié)用 array,比特級(jí)操作選 bitset 或 vector<bool>,混合文本和二進(jìn)制用 std::string。
到此這篇關(guān)于詳解C++ 存儲(chǔ)二進(jìn)制數(shù)據(jù)容器的幾種方法的文章就介紹到這了,更多相關(guān)C++ 存儲(chǔ)二進(jìn)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(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++編程中對(duì)二進(jìn)制文件的讀寫(xiě)操作
- 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語(yǔ)言單鏈表實(shí)現(xiàn)圖書(shū)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言單鏈表實(shí)現(xiàn)圖書(shū)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
c++中移動(dòng)語(yǔ)義和完美轉(zhuǎn)發(fā)及易錯(cuò)點(diǎn)
C++ 中的移動(dòng)語(yǔ)義和完美轉(zhuǎn)發(fā)是 C++11 引入的兩個(gè)重要特性,它們分別用于提高性能和靈活性,這篇文章主要介紹了c++中移動(dòng)語(yǔ)義和完美轉(zhuǎn)發(fā),需要的朋友可以參考下2023-09-09
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之滿二叉樹(shù)、完全二叉樹(shù)的節(jié)點(diǎn)數(shù)計(jì)算詳解
這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之滿二叉樹(shù)、完全二叉樹(shù)節(jié)點(diǎn)數(shù)計(jì)算的相關(guān)資料,通過(guò)代碼示例詳細(xì)展示了如何計(jì)算這兩種二叉樹(shù)的節(jié)點(diǎn)數(shù)量,包括總節(jié)點(diǎn)數(shù)、葉子數(shù)、度為1和度為2的節(jié)點(diǎn)數(shù),需要的朋友可以參考下2026-01-01
詳解如何用alpine鏡像做一個(gè)最小的鏡像并運(yùn)行c++程序
這篇文章主要介紹了詳解如何用alpine鏡像做一個(gè)最小的鏡像并運(yùn)行c++程序,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
C語(yǔ)言動(dòng)態(tài)內(nèi)存管理的原理及實(shí)現(xiàn)方法
C語(yǔ)言動(dòng)態(tài)內(nèi)存管理的原理是通過(guò) malloc() 函數(shù)申請(qǐng)一塊連續(xù)的內(nèi)存空間,并返回其地址,通過(guò) free() 函數(shù)釋放該內(nèi)存空間。實(shí)現(xiàn)方法是通過(guò)在程序運(yùn)行時(shí)動(dòng)態(tài)地管理內(nèi)存,即在需要內(nèi)存時(shí)申請(qǐng),不需要時(shí)釋放,避免了靜態(tài)內(nèi)存分配的浪費(fèi)和不足2023-04-04
C語(yǔ)言用數(shù)組實(shí)現(xiàn)反彈球消磚塊
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言用數(shù)組實(shí)現(xiàn)反彈球消磚塊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05

