本文目录一览

1,CRC8算法疑问

信息大,会分段传输,每段都有自己的crc校验,然后在接收方组合。crc相同的情况叫做crc碰撞,由于crc只有8位,所以发生碰撞的概率比较高,所以一般需要安全性比较高的地方都是用md5或sha1校验的。

CRC8算法疑问

2,VC如何实现CRC8

unsigned char crc8(unsigned char *ptr, unsigned char len) { unsigned char i; unsigned char crc=0; while(len--!=0) { for(i=1; i!=0; i*=2) { if((crc&1)!=0) {crc/=2; crc^=0x8C;} else crc/=2; if((*ptr&i)!=0) crc^=0x8C; } ptr++; } return(crc); }

VC如何实现CRC8

3,crc8校验多项式二0x07为什么是X8 X2 X 1

^加上0X100再进行对应, 例如下面: CRC8 = X^8 + X^2 + X + 1            0x07(0x107)CRC8 = X^8 + X^5 + X^4 + 1           0x31(0x131)CRC8 = X^8 + X^6 + X^4 + X^3 + X^2 + X    0x5E(0x15E)
你的题可能写得不清楚,不难的,你设f(x)=ax^2+bx+c 设1+1/x代入函数,即 f(1+1/x)=a(1+1/x)^2+b(1+1/x)+c=a/x^2+(2a+b)/x+a+b+c 因你题写得不清,我没法再做,但可以这样比较系数,得出方程, 1/x^2的系数相等得:a/x^2=1/x^2 a=1 1/x的系数相等得:(2a+b)/x=1/x b=-1 常数相等得:a+b+c=1 c=1

crc8校验多项式二0x07为什么是X8  X2  X  1

4,java的crc8校验按指定多项式求助

支持一下感觉挺不错的
以下是我的分析,不知是否正确,你参考下1、首先来看你打java代码:crc=(byte)((crc>>1)^0x8c);和 crc=(byte)(crc>>1); 导致这个问题是因为byte的最高位符号位,转换的时候就出错了2、示例代码:package com.test;public class test {public static void main(String[] args) {byte[] ptr = { 1, 1, 1, 1, 1, 1 };byte res = getCrc(ptr);System.out.println();System.out.println((byte)( (1 >> 1) ^ 0x8c ) + ":" +( (1 >> 1) ^ 0x8c ) );}public static byte getCrc(byte[] ptr) {int crc = 0;for (int i = 0; i > 1) ^ 0x8c;} else {crc = crc >> 1;}}}return (byte) crc;}}

5,如何计算十五个字节的CRC8校验

在CRC计算时只用8个数据位,起始位及停止位,如有奇偶校验位也包括奇偶校验位,都不参与CRC计算。  CRC计算方法是:  1、 加载一值为0XFFFF的16位寄存器,此寄存器为CRC寄存器。  2、 把第一个8位二进制数据(即通讯信息帧的第一个字节)与16位的CRC寄存器的相异或,异或的结果仍存放于该CRC寄存器中。  3、 把CRC寄存器的内容右移一位,用0填补最高位,并检测移出位是0还是1。  4、 如果移出位为零,则重复第三步(再次右移一位);如果移出位为1,CRC寄存器与0XA001进行异或。  5、 重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理。  6、 重复步骤2和5,进行通讯信息帧下一个字节的处理。  7、 将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低字节进行交换  8、 最后得到的CRC寄存器内容即为:CRC校验码。
// 8bit crc (x(8) + x(2) + x(1) + 1) typedef unsigned long dword; typedef unsigned short word; typedef unsigned char byte; #define al2_fcs_coef ((1 << 7) + (1 << 6) + (1 << 5)) //data为指向校验数据的指针,length为长度,返回一个字节的校验码 byte getcrc8(unsigned char * data, int length) { byte cfcs = 0; int i, j; for( i = 0; i < length; i ++ ) { cfcs ^= data[i]; for(j = 0; j < 8; j ++) { if(cfcs & 1) { cfcs = (byte)((cfcs >> 1) ^ al2_fcs_coef); } else { cfcs >>= 1; } } } return cfcs; }

6,crc 8位算法的原理有没有有可以帮我分析一下下面的程序呢我实现

一、循环冗余码校验英文名称为cyclical redundancy check,简称crc。它是利用除法及余数的原理来作错误侦测(error detecting)的。实际应用时,发送装置计算出crc值并随数据一同发送给接收装置,接收装置对收到的数据重新计算crc并与收到的crc相比较,若两个crc值不同,则说明数据通讯出现错误。 根据应用环境与习惯的不同,crc又可分为以下几种标准: ①crc-12码; ②crc-16码; ③crc-ccitt码; ④crc-32码。 crc-12码通常用来传送6-bit字符串。crc-16及crc-ccitt码则用是来传送8-bit字符,其中crc-16为美国采用,而crc-ccitt为欧洲国家所采用。crc-32码大都被采用在一种称为point-to-point的同步传输中。 下面以最常用的crc-16为例来说明其生成过程。 crc-16码由两个字节构成,在开始时crc寄存器的每一位都预置为1,然后把crc寄存器与8-bit的数据进行异或,之后对crc寄存器从高到低进行移位,在最高位(msb)的位置补零,而最低位(lsb,移位后已经被移出crc寄存器)如果为1,则把寄存器与预定义的多项式码进行异或,否则如果lsb为零,则无需进行异或。重复上述的由高至低的移位8次,第一个8-bit数据处理完毕,用此时crc寄存器的值与下一个8-bit数据异或并进行如前一个数据似的8次移位。所有的字符处理完成后crc寄存器内的值即为最终的crc值。 下面为crc的计算过程: 1.设置crc寄存器,并给其赋值ffff(hex)。 2.将数据的第一个8-bit字符与16位crc寄存器的低8位进行异或,并把结果存入crc寄存器。 3.crc寄存器向右移一位,msb补零,移出并检查lsb。 4.如果lsb为0,重复第三步;若lsb为1,crc寄存器与多项式码相异或。 5.重复第3与第4步直到8次移位全部完成。此时一个8-bit数据处理完毕。 6.重复第2至第5步直到所有数据全部处理完成。 7.最终crc寄存器的内容即为crc值。 常用的crc循环冗余校验标准多项式如下: crc(16位) = x16+x15+x2+1 crc(ccitt) = x16+x12 +x5+1 crc(32位) = x32+x26+x23+x16+x12+x11+x10+ x8+x7+x5+x4+x2+x+1 以crc(16位)多项式为例,其对应校验二进制位列为1 1000 0000 0000 0101。 注意:这儿列出的标准校验多项式都含有(x+1)的多项式因子;各多项式的系数均为二进制数,所涉及的四则运算仍遵循对二取模的运算规则。 (注:对二取模的四则运算指参与运算的两个二进制数各位之间凡涉及加减运算时均进行xor异或运算,即:1 xor 1=0,0 xor 0=0,1 xor 0=1,0 xor 1=1,即相同为0,不同为1)
CRC32算法学习笔记以及如何用java实现 CRC32算法学习笔记以及如何用java实现一:说明论坛上关于CRC32校验算法的详细介绍不多。前几天偶尔看到Ross N. Williams的文章,总算把CRC32算法的来龙去脉搞清楚了。本来想把原文翻译出来,但是时间参促,只好把自己的一些学习心得写出。这样大家可以更快的了解CRC32的主要思想。由于水平有限,还恳请大家指正。原文可以访问: 。二:基本概念及相关介绍2.1 什么是CRC在远距离数据通信中,为确保高效而无差错地传送数据,必须对数据进行校验即差错控制。循环冗余校验CRC(Cyclic Redundancy Check/Code)是对一个传送数据块进行校验,是一种高效的差错控制方法。CRC校验采用多项式编码方法。多项式乘除法运算过程与普通代数多项式的乘除法相同。多项式的加减法运算以2为模,加减时不进,错位,如同逻辑异或运算。2.2 CRC的运算规则CRC加法运算规则:0+0=00+1=1 1+0=11+1=0 (注意:没有进位)CRC减法运算规则:0-0=00-1=11-0=11-1=0CRC乘法运算规则:0*0=00*1=01*0=01*1=1CRC除法运算规则: 1100001010 (注意:我们并不关心商是多少。)_______________10011 ) 1101011011000010011,,.,,....-----,,.,,....10011,.,,....10011,.,,....-----,.,,....00001.,,....00000.,,....-----.,,....00010,,....00000,,....-----,,....00101,....00000,....-----,....01011....00000....-----....10110...10011...-----...01010..00000..-----..10100.10011.-----.0111000000-----1110 = 余数2.3 如何生成CRC校验码(1) 设G(X)为W阶,在数据块末尾添加W个0,使数据块为M+ W位,则相应的多项式为XrM(X);(2) 以2为模,用对应于G(X)的位串去除对应于XrM(X)的位串,求得余数位串;(3) 以2为模,从对应于XrM(X)的位串中减去余数位串,结果就是为数据块生成的带足够校验信息的CRC校验码位串。2.4 可能我们会问那如何选择G(x)可以说选择G(x)不是一件很容易的事。一般我们都使用已经被大量的数据,时间检验过的,正确的,高效的,生成多项式。一般有以下这些:16 bits: (16,12,5,0) [X25 standard](16,15,2,0) ["CRC-16"]32 bits: (32,26,23,22,16,12,11,10,8,7,5,4,2,1,0) [Ethernet]三: 如何用软件实现CRC算法现在我们主要问题就是如何实现CRC校验,编码和解码。用硬件实现目前是不可能的,我们主要考虑用软件实现的方法。以下是对作者的原文的翻译:我们假设有一个4 bits的寄存器,通过反复的移位和进行CRC的除法,最终该寄存器中的值就是我们所要求的余数。3 2 1 0 Bits+---+---+---+---+Pop <-- | | | | | <----- Augmented message(已加0扩张的原始数据)+---+---+---+---+1 0 1 1 1 = The Poly(注意: The augmented message is the message followed by W zero bits.) 依据这个模型,我们得到了一个最最简单的算法:把register中的值置0.把原始的数据后添加r个0.While (还有剩余没有处理的数据)Begin把register中的值左移一位,读入一个新的数据并置于register的0 bit的位置。If (如果上一步的左移操作中的移出的一位是1)register = register XOR Poly.End现在的register中的值就是我们要求的crc余数。我的学习笔记:可为什么要这样作呢?我们从下面的实例来说明: 1100001010_______________10011 ) 1101011011000010011,,.,,....-----,,.,,....-》 10011,.,,....10011,.,,....-----,.,,....-》 00001.,,....00000.,,....-----.,,....00010,,....00000,,....-----,,....00101,....00000,....我们知道G(x)的最高位一定是1,而商1还是商0是由被除数的最高位决定的。而我们并不关心商究竟是多少,我们关心的是余数。例如上例中的G(x)有5位。我们可以看到每一步作除法运算所得的余数其实就是被除数的最高位后的四位于G(x)的后四位XOR而得到的。那被除数的最高位有什么用呢?我们从打记号的两个不同的余数就知道原因了。当被除数的最高位是1时,商1然后把最高位以后的四位于G(x)的后四位XOR得到余数;如果最高位是0,商0然后把被除数的最高位以后的四位于G(x)的后四位XOR得到余数,而我们发现其实这个余数就是原来被除数最高位以后的四位的值。也就是说如果最高位是0就不需要作XOR的运算了。到这我们总算知道了为什么先前要这样建立模型,而算法的原理也就清楚了。以下是对作者的原文的翻译:可是这样实现的算法却是非常的低效。为了加快它的速度,我们使它一次能处理大于4 bit的数据。也就是我们想要实现的32 bit的CRC校验。我们还是假设有和原来一样的一个4 "bit"的register。不过它的每一位是一个8 bit的字节。3 2 1 0 Bytes+----+----+----+----+Pop <-- | | | | | <----- Augmented message+----+----+----+----+1<------32 bits------> (暗含了一个最高位的“1”)根据同样的原理我们可以得到如下的算法:While (还有剩余没有处理的数据)Begin检查register头字节,并取得它的值求不同偏移处多项式的和register左移一个字节,最右处存入新读入的一个字节把register的值和多项式的和进行XOR运算End我的学习笔记:可是为什么要这样作呢? 同样我们还是以一个简单的例子说明问题:假设有这样的一些值:当前register中的值: 010011014 bit应该被移出的值:1011生成多项式为: 101011100Top Register---- --------1011 01001101 1010 11100 + (CRC XOR)-------------0001 10101101 首4 bits 不为0说明没有除尽,要继续除:0001 10101101 1 01011100 + (CRC XOR)-------------0000 11110001 ^^^^首4 bits 全0说明不用继续除了。那按照算法的意思作又会有什么样的结果呢?1010 11100 1 01011100+ -------------1011 10111100 1011 101111001011 01001101+ -------------0000 11110001现在我们看到了这样一个事实,那就是这样作的结果和上面的结果是一致的。这也说明了算法中为什么要先把多项式的值按不同的偏移值求和,然后在和register进行异或运算的原因了。另外我们也可以看到,每一个头字节对应一个值。比如上例中:1011,对应01001101。那么对于32 bits 的CRC 头字节,依据我们的模型。头8 bit就该有 2^8个,即有256个值与它对应。于是我们可以预先建立一个表然后,编码时只要取出输入数据的头一个字节然后从表中查找对应的值即可。这样就可以大大提高编码的速度了。+----+----+----+----++-----< | | | | | <----- Augmented message| +----+----+----+----+| ^| || XOR| || 0+----+----+----+----+v +----+----+----+----+| +----+----+----+----+| +----+----+----+----+| +----+----+----+----+| +----+----+----+----+| +----+----+----+----++-----> +----+----+----+----++----+----+----+----++----+----+----+----++----+----+----+----++----+----+----+----+255+----+----+----+----+以下是对作者的原文的翻译:上面的算法可以进一步优化为:1:register左移一个字节,从原始数据中读入一个新的字节. 2:利用刚从register移出的字节作为下标定位 table 中的一个32位的值 3:把这个值XOR到register中。4:如果还有未处理的数据则回到第一步继续执行。用C可以写成这样:r=0; while (len--) r = ((r << 8) | p*++) ^ t[(r >> 24) & 0xFF];可是这一算法是针对已经用0扩展了的原始数据而言的。所以最后还要加入这样的一个循环,把W个0加入原始数据。我的学习笔记:注意不是在预处理时先加入W个0,而是在上面算法描述的循环后加入这样的处理。 for (i=0; ir = (r << 8) ^ t[(r >> 24) & 0xFF]; 所以是W/4是因为若有W个0,因为我们以字节(8位)为单位的,所以是W/4个0 字节。注意不是循环w/8次 以下是对作者的原文的翻译: 1:对于尾部的w/4个0字节,事实上它们的作用只是确保所有的原始数据都已被送入register,并且被算法处理。 2:如果register中的初始值是0,那么开始的4次循环,作用只是把原始数据的头4个字节送入寄存器。(这要结合table表的生成来看)。就算register的初始值不是0,开始的4次循环也只是把原始数据的头4个字节把它们和register的一些常量XOR,然后送入register中。 3:(A xor B) xor C = A xor (B xor C) 总上所述,原来的算法可以改为: +----- | v 3 2 1 0 Bytes | +----+----+----+----+ XOR----<| | | | | | +----+----+----+----+ | ^ | | | XOR | | | 0+----+----+----+----+ v +----+----+----+----+ | +----+----+----+----+ | +----+----+----+----+ | +----+----+----+----+ | +----+----+----+----+ | +----+----+----+----+ +----->+----+----+----+----+ +----+----+----+----+ +----+----+----+----+ +----+----+----+----+ +----+----+----+----+ 255+----+----+----+----+ 算法: 1:register左移一个字节,从原始数据中读入一个新的字节. 2:利用刚从register移出的字节和读入的新字节XOR从而产生定位下标,从table中取得相应的值。 3:把该值XOR到register中 4:如果还有未处理的数据则回到第一步继续执行。 我的学习笔记: 对这一算法我还是不太清楚,或许和XOR的性质有关,恳请大家指出为什么? 谢谢。 到这,我们对CRC32的算法原理和思想已经基本搞清了。下章,我想着重根据算法思想用java语言实现。

文章TAG:算法  疑问  crc8  
下一篇