以CRC16-CCITT为例 (
多项式:G(x) = x16 + x12 + x5 + 1
简记式:1021
)
1. 计算原理
- 预置1个16位的寄存器值为0,称为CRC寄存器;
- 取出第一个8位二进制数据左移8位后,与CRC寄存器异或,并把结果放于CRC寄存器;
- 如果寄存器最高位为1, 将寄存器左移1位,再与生成多项式的简记式异或;
否则仅将寄存器左移1位; - 重复第3步,直到左移8次,这样整个8位数据全部进行了处理;
- 将寄存器与0XFFFF进行&(与)运算;
- 重复第2步到第5步,直到处理完所有数据,寄存器中的值即为结果.
2. 代码实现
建立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; }