本文目录一览

1,CRC校验算法

偏移量,即从那个字节开始计算。

CRC校验算法

2,CRC算法怎么算

因为G(x),所以为10101,就是1*x^4+0*x^3+1*x^2+0*x^1+1*x^0所以,为10101,crc校验算法要是不会,可以继续问我
为什么不在网上找一下呢?crc一般常用的有查表法。以前我做一个串口传输入程序的时候,就是在网上找的源代码。然后自己稍稍改了一下就ok了。如果是用计算法的话,说老实话,我也不太明白。呵呵。不过真正应用的时候,重要的是结果。

CRC算法怎么算

3,循环冗余校验CRC的计算方法到底是怎么样的

首先会有b2(x),取b2(x)最高次数数n^d,乘上b1(x)(即在b1(x)最后加上b2(x)最高次数个0)得到c(x),将c(x)用模2除法除以b2(x),(相同位去0,不同位取1),得到的余数就是q(x)
100110010011左移六位,去除以g(x)=1000101,余数是110001,冗余后,b正确收到的应该是 100110010011 110001 这一串。

循环冗余校验CRC的计算方法到底是怎么样的

4,java中CRC算法是个什么东东

CRC算法实现有2种方法,一、查表法,二、直接计算,查表法的计算速度相对来说比较快,本人介绍的方法是直接计算法,用了2种方法实现,都是面向对象进行算法的封装。package com.wms.serial;/*** @author linduo* @version 2006/08/25*/public class CRC16 public int value; public CRC16() value = 0; } /** update CRC with byte b */ public void update(byte aByte) int a, b; a = (int) aByte; for (int count = 7; count >=0; count--) a = a << 1; b = (a >>>8) & 1; if ((value & 0x8000) != 0) value = ((value << 1) + b) ^ 0x1021; } else value = (value << 1) + b; } } value = value & 0xffff; return; } /** reset CRC value to 0 */ public void reset() value = 0; } public int getValue() return value; } public static void main(String[] args) CRC16 crc16 = new CRC16(); byte[] b = new byte[] //(byte) 0xF0,(byte)0xF0,(byte)0xF0,(byte)0x72 (byte) 0x2C,(byte)0x00,(byte)0xFF,(byte)0xFE ,(byte) 0xFE,(byte)0x04,(byte)0x00,(byte)0x00 ,(byte) 0x00,(byte)0x00 }; for (int k = 0; k < b.length; k++) crc16.update(b[k]); } System.out.println(Integer.toHexString(crc16.getValue())); System.out.println(Integer.toHexString(b.length));}}package com.wms.serial;public class CRC162 public static final void main(String[] args) CRC162 crc16 = new CRC162(); byte[] b = new byte[] //(byte) 0xF0,(byte)0xF0,(byte)0xF0,(byte)0x72 (byte) 0x2C,(byte)0x00,(byte)0xFF,(byte)0xFE ,(byte) 0xFE,(byte)0x04,(byte)0x00,(byte)0x00 ,(byte) 0x00,(byte)0x00 }; System.out.println(Integer.toHexString(crc16.encode(b))); //再把这个2f49替换成b数组的最后两个字节的数组,生成一个新的数组b2 byte[] b2 = new byte[] //(byte) 0xF0,(byte)0xF0,(byte)0xF0,(byte)0x72 (byte) 0x2C,(byte)0x00,(byte)0xFF,(byte)0xFE ,(byte) 0xFE,(byte)0x04,(byte)0x00,(byte)0x00 ,(byte) 0x2f,(byte)0x49 }; System.out.println(Integer.toHexString(crc16.encode(b2))); //算出来是 0 //你可以自已构造一些byte进行加解密试试}public short encode(byte[] b) short CRC_x = 0; int pp = 65536; // 1<<16; int pp2 = 69665; // (1<<16) + (1<<12) + (1<<5) + 1 for(int i=0;i<b.length;i++) for(int j=0;j<8;j++) CRC_x = (short)((CRC_x<<1) + (((b[i]<<j)&0x80)>>7)); if((CRC_x/pp) == 1) CRC_x=(short)(CRC_x^pp2); } } } return CRC_x;}}
CRC校验码的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的监督码(既CRC码)r位,并附在信息后边,构成一个新的二进制码序列数共(k+r)位,最后发送出去。在接收端,则根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。在数据存储和数据通讯领域,CRC无处不在:著名的通讯协议X.25的FCS(帧检错序列)采用的是CRC. CCITT,ARJ、LHA等压缩工具软件采用的是CRC32,磁盘驱动器的读写采用了CRC16,通用的图像存储格式GIF、TIFF等也都用CRC作为检错手段。 CRC的本质是模-2除法的余数,采用的除数不同,CRC的类型也就不一样。通常,CRC的除数用生成多项式来表示。最常用的CRC码的生成多项式有CRC16,CRC32.以CRC16为例,16位的CRC码产生的规则是先将要发送的二进制序列数左移16位(既乘以2^16)后,再除以一个多项式,最后所得到的余数既是CRC码,如下式所示,其中K(X)表示n位的二进制序列数,G(X)为多项式,Q(X)为整数,R(X)是余数(既CRC码)。K(X)>>16=G(x)Q(x)+R(x)求CRC码所采用模2加减运算法则,既是不带进位和借位的按位加减,这种加减运算实际上就是逻辑上的异或运算,加法和减法等价,乘法和除法运算与普通代数式的乘除法运算是一样,符合同样的规律。生成CRC码的多项式如下,其中CRC-16和CRC-CCITT产生16位的CRC码,而CRC-32则产生的是32位的CRC码接收方将接收到的二进制序列数(包括信息码和CRC码)除以多项式,如果余数为0,则说明传输中无错误发生,否则说明传输有误,关于其原理这里不再多述。用软件计算CRC码时,接收方可以将接收到的信息码求CRC码,比较结果和接收到的CRC码是否相同。CCITT推荐的高级数据链路控制规程HDLC的帧校验序列FCS中,使用CCITT-16即CRC16,其生成多项式为G(x)=x16+x12+x5+1,CRC-32的生成多项式为G(x)=x32+x26+x23+x22+x16+x11+x10+x16+x8+x7+x5+x4+x2+x+1
不懂。同楼主!

文章TAG:crc算法  CRC校验算法  
下一篇