javacrc16算法的简单介绍

博主:adminadmin 2022-12-12 12:57:06 88

今天给各位分享javacrc16算法的知识,其中也会对进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

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; // 116;

int pp2 = 69665; // (116) + (112) + (15) + 1

for(int i=0;ib.length;i++){

for(int j=0;j8;j++){

CRC_x = (short)((CRC_x1) + (((b[i]j)0x80)7));

if((CRC_x/pp) == 1){

CRC_x=(short)(CRC_x^pp2);

}

}

}

return CRC_x;

}

}

CRC16 c转成java问题?

pFrame是一个结构体指针,++ 表示通过指针获取结构体中的每一个元素。

CRC16校验码如何计算

7E 00 05 60 31 32 33 计算CRC16结果应该是:5B3E

方法如下:

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

1.设置CRC寄存器,并给其赋值FFFF(hex)。

2.将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器。 3.CRC寄存器向右移一位,MSB补零,移出并检查LSB。

4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。

5.重复第3与第4步直到8次移位全部完成。此时一个8-bit数据处理完毕。

6.重复第2至第5步直到所有数据全部处理完成。

7.最终CRC寄存器的内容即为CRC值。

CRC(16位)多项式为 X16+X15+X2+1,其对应校验二进制位列为1 1000 0000 0000 0101。

请将CRC16的C语言算法,改造为JAVA语言算法,万分感谢!

public static int CRC16(byte[] Buf, int Len) {

int CRC;

int i, Temp;

CRC = 0xffff;

for (i = 0; i Len; i++) {

CRC = CRC ^ byteToInteger(Buf[i]);

// System.out.println(byteToInteger(Buf[i]));

for (Temp = 0; Temp 8; Temp++) {

if ((CRC 0x01) == 1)

CRC = (CRC 1) ^ 0xA001;

else

CRC = CRC 1;

}

}

return CRC;

}

javacrc16算法的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、javacrc16算法的信息别忘了在本站进行查找喔。

The End

发布于:2022-12-12,除非注明,否则均为首码项目网原创文章,转载请注明出处。