嵌入式開發與網絡協議中,常需將 16 位整數拆分為兩個 8 位字節存儲或傳輸。本文結合 CRC16 校驗算法,演示如何通過位運算實現高低字節拆分與組合。
int calcByte(int crc, int b) {
crc = crc ^ (b << 8);
for (int i = 0; i < 8; i++) {
if ((crc & 0x8000) == 0x8000)
crc = (crc << 1) ^ 0x1021;
else
crc = crc << 1;
}
return crc & 0xffff;
}
int calc(char* packet, int index, int count) {
int crc = 0;
while (count-- > 0)
crc = calcByte(crc, packet[index++]);
return crc;
}
int crc = calc(Buffer, 1, 12); // 計算 CRC
char* pp = reinterpret_cast<char*>(&crc); // 取地址轉為 char*
Buffer[13] = pp[0]; // 低字節(小端模式)
Buffer[14] = pp[1]; // 高字節
原理:int 佔 2 字節(16 位),char 佔 1 字節(8 位)。通過指釖轉換,可直接訪問內存中的高低字節。注意大小端序影響存儲順序。
| 類型 | 字節數 | 位數 |
|---|---|---|
| char | 1 | 8 |
| int | 2 | 16 |
| long | 4 | 32 |
// 拆分
uint8_t low = crc & 0xFF;
uint8_t high = (crc >> 8) & 0xFF;
// 組合
uint16_t crc = (high << 8) | low;
此法跨平台安全,推薦用於協議解析。
位運算是底層開發核心技能。理解數據在內存中的佈局、掌握移位、掩碼、指針轉換技巧,能高效處理字節流、協議封裝、校驗計算等任務。