breezy
发贴: 3
积分: 0
|
于 2005-11-21 17:02
本算法采用CRC-16码。 其计算过程为:
1. 设置CRC-16寄存器(16-bit),使寄存器中的每一位都置为0。
2. 按顺序逐个传送数据Data(8-bit)。
3. 将Data的最后一位与CRC-16寄存器的最后一位进行异或。
4. 对异或结果进行分析。
若异或结果为1,则CRC-16寄存器先右移一位,并把右移一位的值存入CRC-16寄存器;然后再与多项式码(预先设置好的,16-bit:$A001)逐位异或,最后把异或结果存入CRC-16寄存器。
若异或结果为0,则CRC-16寄存器右移一位,并把右移一位的值存入CRC-16寄存器。
5. 将Data右移一位,并把右移一位的值赋给Data。
6. 重复第3至5步,直到8次移位全部完成。此时Data处理完毕。
7. 重复第2至6步,直到所有数据处理完毕。此时CRC-16寄存器的即为最终CRC-16寄存器的值即为最终CRC-16的值。
8.将最终CRC-16的值转换成4位16进制数 循环冗余校验码 以下是实现代码,各位老兄看看,是不是这样写的?请帮忙指正!
String test1 = "200505279819580113022b7000101014120.00G500223100083129026426489"; short register = (short)0x0000; short ploy = (short)0xA001; byte[] code1 = test1.getBytes(); for(int i=0; i<code1.length;i++){ byte data = code1[i]; for(int j=0;j<8;j++){ if(((data & 0x01) ^ (register & 0x0001)) == 0x1){ register = (short)(register >> 1); register = (short)(register ^ ploy); }else { register = (short)(register >> 1); } data = (byte)(data >> 1); } } register 的值就是最终的CRC校验码。
|