c语言 checksum,crc校验方法,用c语言实现源代码(CRC checksum method, using C language source code).doc...

2023-05-16

crc校验方法,用c语言实现源代码(CRC checksum method, using C language source code)

crc校验方法,用c语言实现源代码(CRC checksum method, using C language source code)

CRC (Cyclic Redundancy Check) 校验应用较为广泛, 以前为了处理简单, 在程序中大多数采用lrc (longitudinal Redundancy Check) 校验, lrc校验很好理解, 编程实现简单.用了一天时间研究了crc的c语言实现, 理解和掌握了基本原理和c语言编程.结合自己的理解简单写下来.

1、crc简介

Crc检验的基本思想是利用线性编码理论, 在发送端根据要传送的k位二进制码序列, 以一定的规则产生一个检验码r位 (就是crc码), 附在信息后面, 构成一个新的二进制码序列数共 (K + R) 位, 最后发送出去.接收端根据同样的规则校验, 以确定传送中是否出错.接收端有两种处理方式: 1、计算k位序列的crc码, 与接收到的crc比较, 一致则接收正确.2、计算整个k + r位的crc码, 若为0, 则接收正确.

Crc码有多种检验位数, 8位、16位、32位等, 原理相同.16位的crc码产生的规则是先将要发送的二进制序列数左移16位 (即乘以2的16次方后), 除以一个多项式, 最后所得到的余数就是crc码.

求crc码所采用的是模2运算法则, 即多项式除法中采用不带借位的减法运算, 运算等同于异或运算.这一点要仔细理解, 是编程的基础.

CRC - 16: (美国二进制同步系统中采用) G (X) = x16 + x15 + x2 + 1

CRC CCITT: (由欧洲ccitt推荐) G (X) = x16 + X12 + X5 + 1

CRC - 32: G (X) = + x22 + x32 + x26 X23 + x16 + X12 + X11 + X10 + x8 + X5 + X4 + + X7 x1 + x2 + 1

2、按位计算crc

采用crc - ccitt多项式, 多项式为0x11021, c语言编程时, 参与计算为0x1021, 这个地方得深入思考才能体会其中的奥妙, 分享一下我的思路: 当按位计算crc时, 例如计算二进制序列为1001 1010 1010 1111时, 将二进制序列数左移16位, 即为1001 1010 1010 (1111 0000 0000 0000 0000 0000 0000 0000), 实际上该二进制序列可拆分为1000 (0000 0000 0000 0000 0000 0000 0000 (000) + 0000 0000 0000 0000 0000 0000 0000 (00) + 0000 0000 0000 1 0000 0000 0000 0000) + (0000 0000 0000 0000 +......)

现在开始分析运算:

< 1 > 对第一个二进制分序列求余数, 竖式除法即为0x10000 ^ 0x11021运算, 后面的0位保留;

< 2 > 接着对第二个二进制分序列求余数, 将第一步运算的余数 * 2后再和第二个二进制分序列一起对0x11021求余, 这一步理解应该没什么问题.如果该分序列为0, 无需计算.

对其余的二进制序列求余与上面两步相同 < 3 >.

< 4 > 计算到最后一位时即为整个二进制序列的余数, 即为crc校验码.

该计算方法相当于对每一位计算,

The operation process is easy to understand and accounts for less memory. The disadvantage is that one bit computing is time-consuming.

C language implementation is given below:

Copy the code code as follows:

Unsigned, char, test[16] = {0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xaa, 0xbb, 0xCC, 0xdd, 0xEE, 0xff};

Unsigned char len = 16;

Void main (void)

{

Unsigned long temp = 0;

Unsigned int crc;

Unsigned char i;

Unsigned, char, *ptr = test;

While (len--) {

For (I = 0x80, I = 0, I = I, 1) {

Temp = temp * 2;

If ((temp & 0x10000) = = 0)

Temp

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c语言 checksum,crc校验方法,用c语言实现源代码(CRC checksum method, using C language source code).doc... 的相关文章

  • 如何用c语言串口通讯,串口通信入门

    在讲解本章的内容之前请大家先反复阅读 手把手教你学51单片机 文档的第11章内容 xff0c 很多概念文档都已详细讲解有 1 波特率 串口通信就是单片机与电脑端 xff0c 单片机与单片机 xff0c 单片机与模块器件之间互发信息进行通信

随机推荐

  • php和js区别

    php和js区别 两者在语法上类似 xff0c 楼上说的对 xff0c js 61 javascript是工作在浏览器端的脚本语言 xff0c 他所提交的数据是交给浏览器来处理的 但是现在的Ajax技术已经可以把js提交的数据交付到浏览器来
  • web前端利用turf.js生成等值线、等值面

    样例如下 xff1a lt DOCTYPE html gt lt html xmlns 61 34 http www w3 org 1999 xhtml 34 gt lt head gt lt meta http equiv 61 34 C
  • python模块名和文件名冲突解决

    对于python初学者 xff0c 很容易练习到一个随机数生成的程序 xff0c 代码如下 xff1a 1 usr bin python 2 import random 3 print random randint 12 20 这个小程序最
  • python3 logging 'ascii' codec can't encode characters

    环境 xff1a mac 10 12 python3 django 1 10 问题发现 最近刚从arch 换到 mac下搬砖 xff0c 发现在arch跑的好好的代码 xff0c 在mac下 终端老是报错 还是编码错误 code try i
  • Hutool之文件工具——FileUtil

    为什么80 的码农都做不了架构师 xff1f gt gt gt 简介 我想在Java工具中 xff0c 文件操作应该也是使用相当频繁的 xff0c 但是Java对文件的操作由于牵涉到流 xff0c 所以较为繁琐 xff0c 各种Stream
  • java中数字与ASCII码的相互转换

    2019独角兽企业重金招聘Python工程师标准 gt gt gt code 测试demo public static void main String args int a 61 91151561 for byte b String va
  • IDEA怎么查看现在的项目使用的JDK版本? 2016年4月19日22:51

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 右键单击项目 xff0c 选择 或者直接使用F4 转载于 https my oschina net sprouting blog 670222
  • 什么是北向接口和南向接口

    Northbound Interface Southbound Interface 南向接口 xff1a 管理其他厂家网管或设备的接口 xff0c 即向下提供的接口 北向接口 xff1a 提供给其他厂家或运营商进行接入和管理的接口 xff0
  • 官网下载mysql源码

    官网下载mysql源码 xff0c 如下为具体步骤 xff1a 1 进入官网点击download页https www mysql com downloads 2 点击MySQL Community Edition进入mysql社区版下载页面
  • Vue设置button的disable属性

    表单元素有一个disable属性 xff0c 用来控制该元素是否可用 1 这个属性在HTML里只有1个值 xff0c 用法就是 lt button disable 61 34 disable 34 gt 点击 lt button gt 经实
  • 用C++进行简单的文件I/O操作

    序论 我曾发表过文件输入输出的文章 xff0c 现在觉得有必要再写一点 文件 I O 在C 43 43 中比烤蛋糕简单多了 在这篇文章里 xff0c 我会详细解释ASCII和二进制文件的输入输出的每个细节 xff0c 值得注意的是 xff0
  • VC++鼠标画圈

    int r 61 100 int x0 61 gameRect left 43 pt x int y0 61 gameRect top 43 pt y int x y double n 61 0 MoveTo x0 y0 while n l
  • matlab练习程序(求向量间的旋转矩阵与四元数)

    问题是这样 xff0c 如果我们知道两个向量v1和v2 xff0c 计算从v1转到v2的旋转矩阵和四元数 xff0c 由于旋转矩阵和四元数可以互转 xff0c 所以我们先计算四元数 我们可以认为v1绕着向量u旋转 角度到v2 xff0c u
  • 用lighttpd搭建一个简易的http服务器

    1 安装lighttpd 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 cd wget http download lighttpd net lighttpd releases
  • 结构体(对齐规则及举例)

    概念 一种数据结构 xff1b C语言中聚合数据类型的一类 xff1b 可以被声明为变量 数组 指针等 xff0c 用以实现比较复杂的数据结构 xff1b 是一系列元素的集合 xff0c 这些元素被称为结构体成员 xff1b 结构体成员需要
  • C++解析头文件-Qt自动生成信号定义

    目录 一 概述二 实现思路三 代码讲解 1 类图2 QtCppDescription3 测试四 源代码 一 概述 上一篇文章C 43 43 解析头文件 Qt自动生成信号声明我们主要讲解了怎么去解析C 43 43 头文件 xff0c 然后在指
  • VC++6.0与VS2010的区别

    区别1 字符串的表达 void CMy123Dlg OnBnClickedButton1 MessageBox 34 你好 34 以前VC6 0写法 现在用不了 老版本用的多字节字符集 MessageBox L 34 你好 34 L 是 u
  • 存储过程出现ORA-06508错误

    一个存储过程平时执行正常 xff0c 刚才执行出ORA 06508错误 百思不得其解 xff0c 好像没有什么不正常的地方啊 xff01 后来找到了答案 重现这个错误如下 xff1a 执行一个存储过程 xff0c 其运行时间比较长 刚开始运
  • 从零构建TCP/IP协议

    从零构建TCP IP协议 这次叫PCT协议 这篇博客是读完 图解TCP IP协议 和 TCP IP协议详解卷一 xff1a 协议 之后的总结 我从0构建了一个可靠的双工的有序的基于流的协议 xff0c 叫做PCT协议 OSI七层模型和TCP
  • c语言 checksum,crc校验方法,用c语言实现源代码(CRC checksum method, using C language source code).doc...

    crc校验方法 用c语言实现源代码 CRC checksum method using C language source code crc校验方法 用c语言实现源代码 CRC checksum method using C languag