我正在尝试将以下方法移植到 Java。到目前为止,我一直没有成功。我一直在研究 stackoverflow 并发现了该问题的几个实现,但我无法让它们中的任何一个工作。
这似乎真的很有希望,但我在这里遗漏了一些东西。低级操作不是我的强项。这是使用 Java 实现通信协议的一部分。
下面是规范中的示例 C 源代码。
计算 CRC
16 位 CRC-CCITT 校验和从 ID_H 计算到最后一个数据字节。参见 C 源代码示例函数如下:
unsigned short crc;
crc = 0;
calc_crc( ID_H );
calc_crc( ID_L );
.
.
calc_crc( <last databyte>);
CRC_H = (unsigned char)(crc>>8);
CRC_L = (unsigned char)crc;
.
.
void calc_crc( unsigned char character )
{
unsigned short crc_tmp;
crc_tmp = (crc ^ character) & 0x0F;
crc = (crc >> 4) ^ (crc_tmp * 4225);
crc_tmp = (crc ^ (character >> 4)) & 0x0F;
crc = (crc >> 4) ^ (crc_tmp * 4225);
}
我目前的实现:
public class CRC16CCITT {
private static int crc = 0;
private static void calc_crc(int character) {
int crc_tmp;
crc_tmp = ((crc ^ character) & 0x0F);
crc = (crc >>> 4) ^ (crc_tmp * 4225);
crc_tmp = ((crc ^ (character >>> 4)) & 0x0F);
crc = (crc >>> 4) ^ (crc_tmp * 4225);
}
public static void update(byte b) {
calc_crc(b);
}
public static void reset() {
crc = 0;
}
public static int highByte() {
return (( crc >> 8) & 0xFF);
}
public static int lowByte() {
return crc & 0xFF;
}
public static int value() {
return crc;
}
public static void main(string[] args) {
// Refactoring test cases atm
}
}
这适用于一些示例,但我认为当我使用超过有符号字节间隔的大数字时它会失败。服务器是 C 制造的,因此这可能是一个相当大的因素。请帮帮我。