iOS CRC16位校验

以CRC16-CCITT为例 (
多项式:G(x) = x16 + x12 + x5 + 1
简记式:1021
)

1. 计算原理

  1. 预置1个16位的寄存器值为0,称为CRC寄存器;
  2. 取出第一个8位二进制数据左移8位后,与CRC寄存器异或,并把结果放于CRC寄存器;
  3. 如果寄存器最高位为1, 将寄存器左移1位,再与生成多项式的简记式异或;
    否则仅将寄存器左移1位;
  4. 重复第3步,直到左移8次,这样整个8位数据全部进行了处理;
  5. 将寄存器与0XFFFF进行&(与)运算;
  6. 重复第2步到第5步,直到处理完所有数据,寄存器中的值即为结果.

2. 代码实现

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

你可能感兴趣的:(iOS CRC16位校验)