本文主要是介绍iOS CRC16校验 (包含大文件失败案例),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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. 代码实现
在计算CRC16时,如果传入+ (uint16_t)calculateCRC_CCITT:(uint8_t*)data size:(uint16_t)size;size类型为uint16_t数据时,在计算大文件(超过32k的数据),由于长度计算错误,crc校验值会出错,所以此方法中需要传入int或者uint32_t类型.
原因在于uint16_t数据类型取值范围溢出,uint8_t为1字节,uint16_t为2字节,uint32_t为4字节,uint64_t为8字节。uint16_t范围为0~32767,粗略计算当文件大小超过32k时,uint16_t溢出,crc计算的size出错,整个crc也是错误的。网上大部分流传的crc计算都是采用uint16_t类型,计算小文件时不会有错,而计算大文件时就会溢出出错。下图为网上流传的iOS crc校验:
这篇关于iOS CRC16校验 (包含大文件失败案例)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!