首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C/C++ 位運算實戰:用 char 存儲 int 的高低 8 位及 CRC16 計算

     編輯:關於C語言

嵌入式開發與網絡協議中,常需將 16 位整數拆分為兩個 8 位字節存儲或傳輸。本文結合 CRC16 校驗算法,演示如何通過位運算實現高低字節拆分與組合。

1. 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;
}

2. 將 16 位結果拆分存入 char 陣列

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 位)。通過指釖轉換,可直接訪問內存中的高低字節。注意大小端序影響存儲順序。

3. 數據類型位寬對照(16 位機)

類型字節數位數
char18
int216
long432

4. 手動拆分/組合通用寫法(不依賴大小端)

// 拆分
uint8_t low = crc & 0xFF;
uint8_t high = (crc >> 8) & 0xFF;

// 組合
uint16_t crc = (high << 8) | low;

此法跨平台安全,推薦用於協議解析。

總結

位運算是底層開發核心技能。理解數據在內存中的佈局、掌握移位、掩碼、指針轉換技巧,能高效處理字節流、協議封裝、校驗計算等任務。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved