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

2024-08-25 15:18
文章标签 校验 案例 ios 失败 crc16

本文主要是介绍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. 代码实现

在计算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校验 (包含大文件失败案例)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1105911

相关文章

SpringBoot3.4配置校验新特性的用法详解

《SpringBoot3.4配置校验新特性的用法详解》SpringBoot3.4对配置校验支持进行了全面升级,这篇文章为大家详细介绍了一下它们的具体使用,文中的示例代码讲解详细,感兴趣的小伙伴可以参考... 目录基本用法示例定义配置类配置 application.yml注入使用嵌套对象与集合元素深度校验开发

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多

MySQL 中的 JSON 查询案例详解

《MySQL中的JSON查询案例详解》:本文主要介绍MySQL的JSON查询的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 的 jsON 路径格式基本结构路径组件详解特殊语法元素实际示例简单路径复杂路径简写操作符注意MySQL 的 J

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

Java使用ANTLR4对Lua脚本语法校验详解

《Java使用ANTLR4对Lua脚本语法校验详解》ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件,下面就跟随小编一起看看Java如何使用ANTLR4对Lua脚本... 目录什么是ANTLR?第一个例子ANTLR4 的工作流程Lua脚本语法校验准备一个Lua Gramm

SpringValidation数据校验之约束注解与分组校验方式

《SpringValidation数据校验之约束注解与分组校验方式》本文将深入探讨SpringValidation的核心功能,帮助开发者掌握约束注解的使用技巧和分组校验的高级应用,从而构建更加健壮和可... 目录引言一、Spring Validation基础架构1.1 jsR-380标准与Spring整合1

Python中使用正则表达式精准匹配IP地址的案例

《Python中使用正则表达式精准匹配IP地址的案例》Python的正则表达式(re模块)是完成这个任务的利器,但你知道怎么写才能准确匹配各种合法的IP地址吗,今天我们就来详细探讨这个问题,感兴趣的朋... 目录为什么需要IP正则表达式?IP地址的基本结构基础正则表达式写法精确匹配0-255的数字验证IP地

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

Pyserial设置缓冲区大小失败的问题解决

《Pyserial设置缓冲区大小失败的问题解决》本文主要介绍了Pyserial设置缓冲区大小失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录问题描述原因分析解决方案问题描述使用set_buffer_size()设置缓冲区大小后,buf

SpringBoot利用@Validated注解优雅实现参数校验

《SpringBoot利用@Validated注解优雅实现参数校验》在开发Web应用时,用户输入的合法性校验是保障系统稳定性的基础,​SpringBoot的@Validated注解提供了一种更优雅的解... 目录​一、为什么需要参数校验二、Validated 的核心用法​1. 基础校验2. php分组校验3