iOS CRC16位校驗

以CRC16-CCITT為例 (
多項式:G(x) = x16 + x12 + x5 + 1
簡記式:1021
)

1. 計算原理

  1. 預(yù)置1個16位的寄存器值為0,稱為CRC寄存器;
  2. 取出第一個8位二進制數(shù)據(jù)左移8位后,與CRC寄存器異或,并把結(jié)果放于CRC寄存器;
  3. 如果寄存器最高位為1, 將寄存器左移1位,再與生成多項式的簡記式異或;
    否則僅將寄存器左移1位;
  4. 重復(fù)第3步,直到左移8次,這樣整個8位數(shù)據(jù)全部進行了處理;
  5. 將寄存器與0XFFFF進行&(與)運算;
  6. 重復(fù)第2步到第5步,直到處理完所有數(shù)據(jù),寄存器中的值即為結(jié)果.

2. 代碼實現(xiàn)

  1. 建立NSData + Extension 類目;

  2. 添加 - (uint16_t)crc16 實例方法;

  3. 代碼如下
    //獲取crc16校驗碼
    - (uint16_t)crc16 {
    const uint8_t *byte = (const uint8_t *)self.bytes;
    uint16_t length = (uint16_t)self.length;
    return gen_crc16(byte, length);
    }

    #define PLOY 0X1021
    
    uint16_t gen_crc16(const uint8_t *data, uint16_t size) {
        uint16_t crc = 0;
        uint8_t i;
        for (; size > 0; size--) {
            crc = crc ^ (*data++ <<8);
            for (i = 0; i < 8; i++) {
                  if (crc & 0X8000) {
                    crc = (crc << 1) ^ PLOY;
                }else {
                    crc <<= 1;
                }
            }
            crc &= 0XFFFF;
        }
        return crc;
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容