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),若余式为零则认为传输无差错;若余式不为零则传输有差错。
代码:
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));
}
}