您的位置:首页 > 其它

CRC

2016-04-12 12:55 281 查看
CRC,全称Cyclic Redundancy Code,意为循环冗余码校验。它是利用除法及余数的原理来作错误侦测的。

实际应用时,发送方计算出CRC值并随数据一同发送给接收装置,接收方对收到的数据重新计算CRC并与收到的CRC相比较,若两个CRC值不同,则说明数据通讯出现错误。

CRC在发送端编码和接收端校验时,都可以利用事先约定的生成多项式G(X)来得到,k位要发送的信息位可对应一个(k-1)次多项式K(X),r位冗余位对应于一个(r-1)次多项式R(X),由k位信息位后面加上r位冗余位组成的n=k+r的码字则对应于一个(n-1)次多项式T(X)X×K(X)+R(X)。也即在发送端产生一个循环冗余码,附加在信息位后面一起发送到接收端。接收端的检验过程就是将接收到的码字多项式除以G(X),若余式为零则认为传输无差错;若余式不为零则传输有差错。

下面以最常用的CRC-16为例来说明其生成过程。
CRC-16码由两个字节构成,在开始时CRC寄存器的每一位都预置为1,然后把CRC寄存器与8-bit的数据进行异或,之后对CRC寄存器从高到低进行移位,在最高位(MSB)的位置补零,而最低位(LSB,移位后已经被移出CRC寄存器)如果为1,则把寄存器与预定义的多项式码进行异或,否则如果LSB为零,则无需进行异或。重复上述的由高至低的移位8次,第一个8-bit数据处理完毕,用此时CRC寄存器的值与下一个8-bit数据异或并进行如前一个数据似的8次移位。所有的字符处理完成后CRC寄存器内的值即为最终的CRC值。

代码:

package CRC;

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));

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: