以CRC16-CCITT為例 (
多項式:G(x) = x16 + x12 + x5 + 1
簡記式:1021
)
1. 計算原理
- 預(yù)置1個16位的寄存器值為0,稱為CRC寄存器;
- 取出第一個8位二進制數(shù)據(jù)左移8位后,與CRC寄存器異或,并把結(jié)果放于CRC寄存器;
- 如果寄存器最高位為1, 將寄存器左移1位,再與生成多項式的簡記式異或;
否則僅將寄存器左移1位; - 重復(fù)第3步,直到左移8次,這樣整個8位數(shù)據(jù)全部進行了處理;
- 將寄存器與0XFFFF進行&(與)運算;
- 重復(fù)第2步到第5步,直到處理完所有數(shù)據(jù),寄存器中的值即為結(jié)果.
2. 代碼實現(xiàn)
建立NSData + Extension 類目;
添加 - (uint16_t)crc16 實例方法;
-
代碼如下
//獲取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; }