将 CRC-ITU 16 c 代码转换为 java
converting CRC-ITU 16 c code to java
我想将 C 代码算法转换为 Java 以计算 CRC。
我正在尝试在我们的项目中实现 BL10 Concox GPS 锁,但我不确定应该将哪个 byte[] 传递给 CRC 计算函数。我也不确定我的 CRC 计算实现是否正确。
我正在将字节[]从数据包长度传递到信息序列号,如下所述。
Error check (From “Packet Length” to“Information Serial
Number”) , are values of CRC-ITU. CRC error occur when the received
information is calculated, the receiver will ignore and discard the data
packet.
这里是通信协议pdf:
https://drive.google.com/file/d/1AsBk3iPyLGk4QyuDevYx86lJlfUVYE1t/view
下面是C代码。
C代码:
static const U16 crctab16[] ={
0X0000, 0X1189, 0X2312, 0X329B, 0X4624, 0X57AD, 0X6536, 0X74BF,
0X8C48, 0X9DC1, 0XAF5A, 0XBED3, 0XCA6C, 0XDBE5, 0XE97E, 0XF8F7,
//remove some constant
0XF78F, 0XE606, 0XD49D, 0XC514, 0XB1AB, 0XA022, 0X92B9, 0X8330,
0X7BC7, 0X6A4E, 0X58D5, 0X495C, 0X3DE3, 0X2C6A, 0X1EF1, 0X0F78,
};
// calculate the 16-bit CRC of data with predetermined length.
U16 GetCrc16(const U8* pData, int nLength){
U16 fcs = 0xffff; // initialization
while(nLength>0){
fcs = (fcs >> 8) ^ crctab16[(fcs ^ *pData) & 0xff];
nLength--;
pData++;
}
return ~fcs; // negated
}
到目前为止我已经尝试过:
Java代码:
private static int crctab16[] = { 0X0000, 0X1189, 0X2312, 0X329B, 0X4624, 0X57AD, 0X6536, 0X74BF, 0X8C48, 0X9DC1,
0XAF5A, 0XBED3, 0XCA6C, 0XDBE5, 0XE97E, 0XF8F7, 0X1081, 0X0108, 0X6306, 0X728F, 0X4014, 0X519D, 0X2522,
0X34AB, 0X0630, 0X17B9, 0XEF4E, 0XFEC7, 0XCC5C, 0XDDD5, 0XA96A, ....
0X8B70, 0X8408, 0X9581, 0XA71A, 0XB693, 0XC22C, 0XD3A5, 0XE13E,
0XC60C, 0XD785, 0XE51E, 0XF497, 0X8028, 0X91A1, 0XA33A, 0XB2B3,
0XB1AB, 0XA022, 0X92B9, 0X8330, 0X7BC7, 0X6A4E, 0X58D5, 0X495C, 0X3DE3, 0X2C6A, 0X1EF1, 0X0F78, };
public static int GetCrc16(final byte[] pData) {
int crc = 0xffff;// initialization
for (byte b : pData) {
crc = (crc >>> 8) ^ crctab16[(crc ^ b) & 0xff];
}
return crc;
}
我使用 this 检查了结果,但没有得到正确的结果。
您的 return crc;
需要 return crc ^ 0xffff;
。请注意 C 代码中 return ~fcs;
中的 ~
。你没有否定结果。它甚至提供了有用的评论 "negated".
您可以使用 ~crc
,但是您需要使用 ~crc & 0xffff
,因为 int
是 32 位的。所以最好使用crc ^ 0xffff
.
这里不需要使用>>>
。您可以只使用 >>
因为 crc
永远不会为负。哪个都可以。
我想将 C 代码算法转换为 Java 以计算 CRC。 我正在尝试在我们的项目中实现 BL10 Concox GPS 锁,但我不确定应该将哪个 byte[] 传递给 CRC 计算函数。我也不确定我的 CRC 计算实现是否正确。
我正在将字节[]从数据包长度传递到信息序列号,如下所述。
Error check (From “Packet Length” to“Information Serial Number”) , are values of CRC-ITU. CRC error occur when the received information is calculated, the receiver will ignore and discard the data packet.
这里是通信协议pdf:
https://drive.google.com/file/d/1AsBk3iPyLGk4QyuDevYx86lJlfUVYE1t/view
下面是C代码。
C代码:
static const U16 crctab16[] ={
0X0000, 0X1189, 0X2312, 0X329B, 0X4624, 0X57AD, 0X6536, 0X74BF,
0X8C48, 0X9DC1, 0XAF5A, 0XBED3, 0XCA6C, 0XDBE5, 0XE97E, 0XF8F7,
//remove some constant
0XF78F, 0XE606, 0XD49D, 0XC514, 0XB1AB, 0XA022, 0X92B9, 0X8330,
0X7BC7, 0X6A4E, 0X58D5, 0X495C, 0X3DE3, 0X2C6A, 0X1EF1, 0X0F78,
};
// calculate the 16-bit CRC of data with predetermined length.
U16 GetCrc16(const U8* pData, int nLength){
U16 fcs = 0xffff; // initialization
while(nLength>0){
fcs = (fcs >> 8) ^ crctab16[(fcs ^ *pData) & 0xff];
nLength--;
pData++;
}
return ~fcs; // negated
}
到目前为止我已经尝试过:
Java代码:
private static int crctab16[] = { 0X0000, 0X1189, 0X2312, 0X329B, 0X4624, 0X57AD, 0X6536, 0X74BF, 0X8C48, 0X9DC1,
0XAF5A, 0XBED3, 0XCA6C, 0XDBE5, 0XE97E, 0XF8F7, 0X1081, 0X0108, 0X6306, 0X728F, 0X4014, 0X519D, 0X2522,
0X34AB, 0X0630, 0X17B9, 0XEF4E, 0XFEC7, 0XCC5C, 0XDDD5, 0XA96A, ....
0X8B70, 0X8408, 0X9581, 0XA71A, 0XB693, 0XC22C, 0XD3A5, 0XE13E,
0XC60C, 0XD785, 0XE51E, 0XF497, 0X8028, 0X91A1, 0XA33A, 0XB2B3,
0XB1AB, 0XA022, 0X92B9, 0X8330, 0X7BC7, 0X6A4E, 0X58D5, 0X495C, 0X3DE3, 0X2C6A, 0X1EF1, 0X0F78, };
public static int GetCrc16(final byte[] pData) {
int crc = 0xffff;// initialization
for (byte b : pData) {
crc = (crc >>> 8) ^ crctab16[(crc ^ b) & 0xff];
}
return crc;
}
我使用 this 检查了结果,但没有得到正确的结果。
您的 return crc;
需要 return crc ^ 0xffff;
。请注意 C 代码中 return ~fcs;
中的 ~
。你没有否定结果。它甚至提供了有用的评论 "negated".
您可以使用 ~crc
,但是您需要使用 ~crc & 0xffff
,因为 int
是 32 位的。所以最好使用crc ^ 0xffff
.
这里不需要使用>>>
。您可以只使用 >>
因为 crc
永远不会为负。哪个都可以。