iOS CRC16校验 (包含大文件失败案例)

本文详细介绍了CRC16-CCITT的计算原理,并指出在iOS中,当处理超过32k的大文件时,由于uint16_t数据类型的长度计算溢出,会导致CRC校验错误。解决方案是使用更大的数据类型如uint32_t来避免此类问题。同时,文章还提供了错误案例分析和修正后的CRC计算方法。
摘要由CSDN通过智能技术生成

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. 代码实现

在计算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校验:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值