CRC原理总结

CRC常用于判断文件在传输过程中文件内容是否被更改以及其他的一些加密算法,在Java中,CRC32 工具类提供给我们使用。

1.CRC校验具体原理如下:

  在要发送的数据帧后面附加一个数(这个就是用来校验的验证码,都为二进制序列),生成一个新帧发送给接受端。当然这个附加的数不能是随意的,它要使所生成的新帧与

发送端和接收端共同选定某个数整除(注意:这里不是使用的二进制除法,而是一种称为:模2除法)。生成的新帧到达接收端后,再用这个新帧除以(同上)这个选定的数。

因为在发送之前就已经附加了一个数,做了”去余“处理。也就能够整除了。所以结果应该没有余数。如果有余数则表示在传输过程中出了差错。

说明:

  ”模2除法“ 与算术除法类似,但它既不向上借位,也不比较除数与被除数的相同位数值大小,只要以相同位数进行相除就可以了。模2加法运算为:1+1=0;1+0=1;0+1=1;0+0=0

2.模2减法运算为:1-1=0;1-0=1;0-1=1;0-0=0。相当于二进制中逻辑异或运算(相同为1,不同为0)。如100101除以1110,结果得到商为11,余数为1.如11*11=101

3.CRC具体执行步骤:

  1.先选择一个用于在接收端进行校验时,对接收的帧进行除法运算的除数

  2.看所选择的除数二进制数(假设k位),然后在要发送的数据帧(假设m位)后面加上k-1位”0“,然后以这个加了k-1个"0"的新帧(一共是m+k-1位)以”模2除法“方式除以上面这个除数,所得到的余数(也就是二进制字符串)就是该帧的CRC校验码,也称为:FCS(帧校验序列)。但一定要注意:余数的位数一定要是比除数位数只能少一位,哪怕前面一位是0,甚至全为0,也都不能省略。

  3.再把这个校验码附在原数据帧(也就是m位的帧,注意不是在后面形成的m+k-1为的帧)后面,构建一个新帧发送给接收端。最后把这个接收端以”模2除法“方式除以前面选择的除数,如果没有了余数,则表明该帧在传输过程中没有出现差错。

4.总结
  从上面可以看出:CRC有2个关键的点。一是要选择一个发送端和接收端都用来作为除数的二进制比特串(或多项式)。二是用原始帧与上面选择的进行二进制除法运算,计算出FCS。前者可以随机选择,也可以按照国际通用标准进行选择,但最高为与最低为都必须为1,CRC16=X^16+X^15+X^2+X(对应二进制:11000000000000101)

5.案例

  选择CRC生成多项式G(X)=X^4+X^3+1,要求求出二进制序列10110011的CRC校验码。

参考:https://wenku.baidu.com/view/34ba49149b89680202d82513.htmlram=1

http://www.repairfaq.org/filipg/LINK/F_crc_v31.html

原文地址:https://www.cnblogs.com/coding400/p/9011668.html

时间: 2025-01-15 00:29:57

CRC原理总结的相关文章

【校验】CRC 原理和程序实现

CRC(循环冗余校验)由于实现简单,检错努力强,被广泛的使用在各种数据校验应用中:占用系统资源极少,用软硬件均能实现,是进行数据传输差错检测的一种很好的手段.

CRC

一.CRC的作用 CRC的英文全称为Cyclic Redundancy Check(Code),中文名称为循环冗余校验(码).它是一类重要的线性分组码,编码和解码方法简单,检错和纠错能力强,在通信领域广泛地用于实现差错控制.  二.CRC的原理 (一)CRC的校验过程描述 1. 被校验的原数据转换成二进制序列,假设共K位 2. 以一定规则产生一个新的二进制序列,假设共R位的. 3. 把新的二进制序列附加在原数据二进制序列后面,共K+R位,发送出去. 4. 接收端接收数据后,把原数据的K位二进制序

CRC 转载自poiu_elab用于收藏

国人讲CRC的没有什么能讲明白的文章,除了一篇<我学习 CRC32.CRC16.CRC 原理和算法的总结(与 WINRAR 结果一致)>,这里先感谢他,另,他也有一些没有说明白的地方,怎么说呢,还是鄙人自己来吧. 我弄明白CRC这个原理和算法主要参考的是上面的国人的那篇和这个外国的<A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS INDEX V3.00 (9/24/96)>,地址 http://www.repairfaq.org

crc循环冗余检验

CRC(Cyclic Redundancy Check):循环冗余检验.在链路层被广泛使用的检错技术. CRC原理: 1.发送端 1.1.在发送端先将数据分组,每组k个数据.假定要传送的数据是M. 1.2.在数据M后面添加供差错检测的n位冗余码,然后构成一帧发送出去,一共发送(k+n)位. 虽然添加n位冗余码增大了数据传送的开销,但是可以进行差错检测,当传输可能出现差错时,付出这种代价是值得的. 1.3.冗余码可以用下面的方法得出: 3.1.用二进制模2运算进行2^n*M(相当于M左移n位)的运

[转]CRC校验

一.CRC原理. CRC校验的原理非常简单,如下图所示. 其中,生成多项式是利用抽象代数的一些规则推导出来的,而模2加(也就是异或),是对应于有限域的除法. 二.CRC算法. 那么在FPGA当中,也有好几种算法. 1.比特型算法. 这种算法,跟手算的差不多,一个时钟周期处理一个bit,速度慢,但消耗的面积小. 可能你会有疑问,本来是第15位(对应于x^15),再移位就是第16位,怎样把第16位转化成低于16位的数? 利用生成多项式就可以了,crc16 : 1+x^2+x^15+x^16,类似于小

在Visual C++中使用内联汇编

一.内联汇编的优缺点 因为在Visual C++中使用内联汇编不需要额外的编译器和联接器,且可以处理Visual C++中不能处理的一些事情,而且可以使用在C/C++中的变量,所以非常方便.内联汇编主要用于如下场合: 1.使用汇编语言写函数: 2.对速度要求非常高的代码: 3.设备驱动程序中直接访问硬件: 4."Naked" Call的初始化和结束代码. //(."Naked",理解了意思,但是不知道怎么翻译^_^,大概就是不需要C/C++的编译器(自作聪明)生成的

Redis源码中的CRC校验码(crc16、crc64)原理浅析

在阅读Redis源码的时候,看到了两个文件:crc16.c.crc64.c.下面我抛砖引玉,简析一下原理. CRC即循环冗余校验码,是信息系统中一种常见的检错码.大学课程中的"计算机网络"."计算机组成"等课程中都有提及.我们可能都了解它的数学原理,在试卷上手工计算一个CRC校验码,并不是难事.但是计算机不是人,现实世界中的数学原理需要转化为计算机算法才能实现目的.实际上作为计算机专业背景人并不会经常使用或接触到CRC的计算机算法实现的原理,通常是电子学科背景的人士

CRC校验码原理、实例、手动计算

CRC16实现代码 思路:取一个字符(8bit),逐位检查该字符,如果为1,crc^crc_mul;同时,如果原本crc最高位是1,那么crc^crc_mul后左移1位,否则只是左移一位.计算完一个字符后,装入下一个字符. #include<stdio.h> #define crc_mul 0x1021 //生成多项式 unsigned int cal_crc(unsigned char *ptr, unsigned char len) { unsigned char i; unsigned

最通俗的CRC校验原理剖析

http://winda.blog.51cto.com/55153/1063951 循环冗余校验码(CRC)的检错能力更强,可以检出多位错误. 1. CRC校验原理 CRC校验原理看起来比较复杂,好难懂,因为大多数书上基本上是以二进制的多项式形式来说明的.其实很简单的问题,其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端.当然,这个附加的数不是随意的,它要使所生成的新帧能与发送端和接收端共同选定的某个特定数