Java CRC 16 计算代码
Java code for CRC 16 calculation
下面是我的十六进制字符串
String str="01312D0102D6010162000600000918000000000000000000000000007FFF00150010004B0100003A200207000004040055516200050E9E000200000000005852324531533156304330000001614B00541E0C07110507320000000000000000000000000500000000000000000406000030313030313033300000000000000000000046300A1D1655000186A0FFFF9EAA00000043000000000200000C000C000C000C000D000C000D000C000D000C000D000D000C000C000C000C000D000C000D000D000C000D000D000C000D000D000C000D000D000D000C000D000D000D000E000D000C000D000D000D000D000C000D000D000D000E000D000D000D000C000D000D029E029F02F102EA05300544085A07C1060F040A036404E0072F064804AA040404070510066B067205C304B302C6000D000D000D000E000D000D000E000D000E000D000D000E000D000D000E000D000E000D000E000D000E000D000D0065006300810081025102E001990082001F000E000D000E000D000E000E000D000E000D000E000E001500560062003300480068009000AF00AE00AE0214048404670560007E000E000E000E000E000E000F000E000E000E000E000E005501290168000E000E000D000E000E000E000D000E000E000E000D000E000E000D000E000E000D000E000E000D000E000E000D000E000D000E000E000E000D000E000E000D000E000E000D000E000E000D000E000E000E000D000E000E000D000E000E000D000E000E000E000D000E000E000E000D000E000E000E000D000E000E000D000E000E000E000D000E000E000E000D000E000E000E000D000E000E000E000D000E000E000E000D000E000E000D000E000E000D000E000E000E000D000E000D000E000D000E000D000E000D000E000E000D000E000D000D000D000D000D000C000D000D000E000D000D000D000D000D000D000D000E000D000D000E000D000D000E000D000D000D000D000D00E200DF00DF000F000E000D007300DF";
这是我的 CRC:A228 附加到上面的字符串。
我希望输出为 A228
使用的多项式是 0xA001
谁能给我提供计算CRC16的代码
下面是我的java代码
String str="01312D0102D6010162000600000918000000000000000000000000007FFF00150010004B0100003A200207000004040055516200050E9E000200000000005852324531533156304330000001614B00541E0C07110507320000000000000000000000000500000000000000000406000030313030313033300000000000000000000046300A1D1655000186A0FFFF9EAA00000043000000000200000C000C000C000C000D000C000D000C000D000C000D000D000C000C000C000C000D000C000D000D000C000D000D000C000D000D000C000D000D000D000C000D000D000D000E000D000C000D000D000D000D000C000D000D000D000E000D000D000D000C000D000D029E029F02F102EA05300544085A07C1060F040A036404E0072F064804AA040404070510066B067205C304B302C6000D000D000D000E000D000D000E000D000E000D000D000E000D000D000E000D000E000D000E000D000E000D000D0065006300810081025102E001990082001F000E000D000E000D000E000E000D000E000D000E000E001500560062003300480068009000AF00AE00AE0214048404670560007E000E000E000E000E000E000F000E000E000E000E000E005501290168000E000E000D000E000E000E000D000E000E000E000D000E000E000D000E000E000D000E000E000D000E000E000D000E000D000E000E000E000D000E000E000D000E000E000D000E000E000D000E000E000E000D000E000E000D000E000E000D000E000E000E000D000E000E000E000D000E000E000E000D000E000E000D000E000E000E000D000E000E000E000D000E000E000E000D000E000E000E000D000E000E000E000D000E000E000D000E000E000D000E000E000E000D000E000D000E000D000E000D000E000D000E000E000D000E000D000D000D000D000D000C000D000D000E000D000D000D000D000D000D000D000E000D000D000E000D000D000E000D000D000D000D000D00E200DF00DF000F000E000D007300DF";//A228";
byte arr[] = toByteArray(str);
long polynomial = 0xA001;
long CRC = 0xFFFF;
for (byte b : arr)
{
CRC ^= b;
for (int i = 8; i != 0; i--)
{
if ((CRC & 0x0001) != 0)
{
CRC = (CRC >> 1) ^ polynomial;
}
else
{
CRC >>= 1;
}
}
}
System.out.println(CRC);
}
我得到的输出为 -56289
您的代码基本没问题,并且会为该消息生成 0xa228
(经过以下修改),只是您必须向其提供正确的数据,然后正确显示生成的 CRC。
要为它提供正确的数据,您首先需要将该串十六进制字符转换为一半的二进制字节。将 that 提供给您的 CRC 例程。
其次,以十六进制而不是十进制显示结果。
第三,byte
是有符号的,所以CRC ^= b & 0xff;
也是为了避免符号扩展。
下面是我的十六进制字符串
String str="01312D0102D6010162000600000918000000000000000000000000007FFF00150010004B0100003A200207000004040055516200050E9E000200000000005852324531533156304330000001614B00541E0C07110507320000000000000000000000000500000000000000000406000030313030313033300000000000000000000046300A1D1655000186A0FFFF9EAA00000043000000000200000C000C000C000C000D000C000D000C000D000C000D000D000C000C000C000C000D000C000D000D000C000D000D000C000D000D000C000D000D000D000C000D000D000D000E000D000C000D000D000D000D000C000D000D000D000E000D000D000D000C000D000D029E029F02F102EA05300544085A07C1060F040A036404E0072F064804AA040404070510066B067205C304B302C6000D000D000D000E000D000D000E000D000E000D000D000E000D000D000E000D000E000D000E000D000E000D000D0065006300810081025102E001990082001F000E000D000E000D000E000E000D000E000D000E000E001500560062003300480068009000AF00AE00AE0214048404670560007E000E000E000E000E000E000F000E000E000E000E000E005501290168000E000E000D000E000E000E000D000E000E000E000D000E000E000D000E000E000D000E000E000D000E000E000D000E000D000E000E000E000D000E000E000D000E000E000D000E000E000D000E000E000E000D000E000E000D000E000E000D000E000E000E000D000E000E000E000D000E000E000E000D000E000E000D000E000E000E000D000E000E000E000D000E000E000E000D000E000E000E000D000E000E000E000D000E000E000D000E000E000D000E000E000E000D000E000D000E000D000E000D000E000D000E000E000D000E000D000D000D000D000D000C000D000D000E000D000D000D000D000D000D000D000E000D000D000E000D000D000E000D000D000D000D000D00E200DF00DF000F000E000D007300DF";
这是我的 CRC:A228 附加到上面的字符串。 我希望输出为 A228
使用的多项式是 0xA001
谁能给我提供计算CRC16的代码
下面是我的java代码
String str="01312D0102D6010162000600000918000000000000000000000000007FFF00150010004B0100003A200207000004040055516200050E9E000200000000005852324531533156304330000001614B00541E0C07110507320000000000000000000000000500000000000000000406000030313030313033300000000000000000000046300A1D1655000186A0FFFF9EAA00000043000000000200000C000C000C000C000D000C000D000C000D000C000D000D000C000C000C000C000D000C000D000D000C000D000D000C000D000D000C000D000D000D000C000D000D000D000E000D000C000D000D000D000D000C000D000D000D000E000D000D000D000C000D000D029E029F02F102EA05300544085A07C1060F040A036404E0072F064804AA040404070510066B067205C304B302C6000D000D000D000E000D000D000E000D000E000D000D000E000D000D000E000D000E000D000E000D000E000D000D0065006300810081025102E001990082001F000E000D000E000D000E000E000D000E000D000E000E001500560062003300480068009000AF00AE00AE0214048404670560007E000E000E000E000E000E000F000E000E000E000E000E005501290168000E000E000D000E000E000E000D000E000E000E000D000E000E000D000E000E000D000E000E000D000E000E000D000E000D000E000E000E000D000E000E000D000E000E000D000E000E000D000E000E000E000D000E000E000D000E000E000D000E000E000E000D000E000E000E000D000E000E000E000D000E000E000D000E000E000E000D000E000E000E000D000E000E000E000D000E000E000E000D000E000E000E000D000E000E000D000E000E000D000E000E000E000D000E000D000E000D000E000D000E000D000E000E000D000E000D000D000D000D000D000C000D000D000E000D000D000D000D000D000D000D000E000D000D000E000D000D000E000D000D000D000D000D00E200DF00DF000F000E000D007300DF";//A228";
byte arr[] = toByteArray(str);
long polynomial = 0xA001;
long CRC = 0xFFFF;
for (byte b : arr)
{
CRC ^= b;
for (int i = 8; i != 0; i--)
{
if ((CRC & 0x0001) != 0)
{
CRC = (CRC >> 1) ^ polynomial;
}
else
{
CRC >>= 1;
}
}
}
System.out.println(CRC);
}
我得到的输出为 -56289
您的代码基本没问题,并且会为该消息生成 0xa228
(经过以下修改),只是您必须向其提供正确的数据,然后正确显示生成的 CRC。
要为它提供正确的数据,您首先需要将该串十六进制字符转换为一半的二进制字节。将 that 提供给您的 CRC 例程。
其次,以十六进制而不是十进制显示结果。
第三,byte
是有符号的,所以CRC ^= b & 0xff;
也是为了避免符号扩展。