多语言展示
当前在线:940今日阅读:103今日分享:49

Java生成crc16校验码

在socket通讯中,求一组数据的crc校验码是很重要的。  CRC即循环冗余校验码是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性
工具/原料
1

myeclipse/eclipse

2

传感器

3

电脑

4

传感器和电脑都在同一个交换机下面

java代码
1

电脑是服务器,发送一组添加校验码的数据给传感器,传感器返回数据;    这个过程中,肯定是有rs485协议或者是modbus协议等等,把rs232转换为其他信号;   的来说,根据设备探测器来进行协议的转换。传感器是和电脑都在一个交换机下面。由于我是做软件的,这个硬件具体的我也不是太清楚。

2

crc16校验码的原理如下:假设数据传输过程中需要发送15位的二进制信息g=101,那么这串二进制码可表示为代数多项式g(x) = x^14 + x^12 + x^9 + x^8 + x^7 + x^5 + 1。将g(x)乘以x^m,既将g后加m个0,然后除以m阶多项式h(x),得到的(m-1)阶余项r(x)对应的二进制码r就是CRC编码。备注:g(x)和h(x)的除运算,可以通过g和h做xor(异或)运算。比如将11001与10101做xor运算

3

CRC-16校验码计算方法:常用查表法和计算法。计算方法一般都是:(1)、预置1个16位的寄存器为十六进制FFFF(即全为1),称此寄存器为CRC寄存器;(2)、把第一个8位二进制数据(既通讯信息帧的第一个字节)与16位的CRC寄存器的低       8位相异或,把结果放于CRC寄存器,高八位数据不变;(3)、把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位;(4)、如果移出位为0:重复第3步(再次右移一位);如果移出位为1,CRC寄存器与多    项式A001(1010 0000 0000 0001)进行异或;(5)、重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;(6)、重复步骤2到步骤5,进行通讯信息帧下一个字节的处理;(7)、将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低       字节进行交换;(8)、最后得到的CRC寄存器内容即为:CRC码

4

理论知识看着特别复杂,只有自己亲自计算以后,才会发现其中的规律,我附上自己计算的7张图纸,有不懂得可以看一下,也许就会豁然开朗的!顺序我视乎乱了,不过仔细看一下是可以分出来顺序的!!

5

package cn.com.pd;public class Crc {    public static int [] getCrc(byte[] data) {        int flag;        // 16位寄存器,所有数位均为1        int wcrc = 0xffff;        for (int i = 0; i < data.length; i++) {            // 16 位寄存器的低位字节            // 取被校验串的一个字节与 16 位寄存器的低位字节进行“异或”运算            wcrc = wcrc ^ data[i];            for (int j = 0; j < 8; j++) {                flag = wcrc & 0x0001;                // 把这个 16 寄存器向右移一位                wcrc = wcrc >> 1;                // 若向右(标记位)移出的数位是 1,则生成多项式 1010 0000 0000 0001 和这个寄存器进行“异或”运算                if (flag == 1)                    wcrc ^= 0xa001;            }        }        //获取低八位        int low=wcrc>>8;//或者wcrc/256        int up=wcrc%256;//获取高八位        int [] crc={up,low};        return crc;}}

6

实践结果,控制台打印出36 40;对应的十六进制就是24 28而且socket返回了数据,就说明无论是以16进制还是10进制发送数据给传感器,都是可以的,可行的!

推荐信息