在網路程式開發、嵌入式系統、國防航太與軍工等領域,頻寬與儲存空間往往是稀缺資源。傳統的位元組對齊存取方式會造成顯著浪費——一個 bool 變數實際只需 1 位,卻佔用整個位元組。若能直接以位元為單位讀寫緩衝區,即可將 8 個布林值壓縮進單一位元組,大幅降低傳輸開銷。本文分享一套完整的 C++ 位元級讀寫工具集,包含單位元讀寫、任意長度資料讀寫及字串處理,並針對大小端架構做了適配。
工具集提供四組核心函數,全部採用「緩衝區指標 + 起始位位移 + 輸出結束位位移」的統一協議,方便串聯操作:
int、float、結構體等)的任意位長讀寫。void ReadOneBit(byte* pBuffer, int nStart, int& nEnd, byte& retByte) {
byte btData = pBuffer[nStart / 8]; // 定位所在位元組
btData = btData << (nStart % 8); // 目標位移至最高位
retByte = btData >> 7; // 取出該位(0 或 1)
nEnd = nStart + 1;
}
template<typename T>
void ReadDataFromBuffer(byte* pBuffer, int nStart, byte btLength, int& nEnd, T& retData) {
retData = 0;
if (btLength > sizeof(T) * 8) return; // 長度保護
byte btData;
while (btLength--) {
ReadOneBit(pBuffer, nStart, nStart, btData);
retData |= (T(btData) << btLength); // 高位優先組裝
}
nEnd = nStart;
}
寫入端需考慮目標機器的位元序。程式碼中註釋掉的「大端模式」直接順序寫位;實際啟用的「小端模式」先處理不足一位元組的殘餘位,再逐位元組寫入,確保跨平台一致性:
template<typename T>
void WriteDataToBuffer(byte* pBuffer, T tData, int nStart, byte btLength, int& nEnd) {
byte btDataLength = sizeof(T);
if (btLength > btDataLength * 8) return;
byte* ptData = (byte*)&tData;
int nSet = btLength / 8; // 完整位元組數
int nRin = btLength % 8; // 殘餘位數
byte byteData, bitData; int nTempEnd;
// 先寫殘餘高位(小端低位在前,故從 ptData[nSet] 取高位)
byteData = ptData[nSet];
while (nRin--) {
ReadOneBit(&byteData, 7 - nRin, nTempEnd, bitData);
WriteOneBit(pBuffer, bitData, nStart, nStart);
}
// 再寫完整位元組
while (nSet--) {
byteData = ptData[nSet];
for (int i = 0; i < 8; ++i) {
ReadOneBit(&byteData, i, nTempEnd, bitData);
WriteOneBit(pBuffer, bitData, nStart, nStart);
}
}
nEnd = nStart;
}
目前實現以「逐位迴圈」為主,適合教學與小資料量場景。實務上可改用「位元組級批次搬移 + 邊界位元修補」策略:
memcpy;此法可將大塊資料處理速度提升數十倍,特別適合網路封包序列化、檔案壓縮等高吞吐場景。
// 假設協定:1 位版本 | 3 位指令 | 12 位長度 | N 位載荷
struct PacketHeader {
uint8_t ver : 1;
uint8_t cmd : 3;
uint16_t len : 12;
};
byte buffer[1024];
int pos = 0;
PacketHeader hdr = {1, 5, 128};
WriteDataToBuffer(buffer, hdr, pos, 16, pos); // 16 位 = 1+3+12
// 繼續寫入載荷...
位元級存取是系統級程式設計的基本功。本文提供的工具集雖算法尚待優化,但介面清晰、支援泛型、兼容大小端,已可直接用於專案原型開發。後續可結合 SIMD 指令集(AVX2/AVX-512)實現向量化位元操作,進一步釋放 CPU 算力。