将C CRC16转换为Java CRC16

我目前正在开展一个项目,有一个嵌入式系统通过无线电将数据发送到PC。 数据包最后获得crc16校验和,并根据此算法计算:

uint16_t crc16 (const uint8_t * buffer, uint32_t size) { uint16_t crc = 0xFFFF; if (buffer && size) while (size--) { crc = (crc >> 8) | (crc <> 4; crc ^= crc << 12; crc ^= (crc & 0xFF) << 5; } return crc; } 

现在我正在寻找Java中的等价物。 我已经在这里找到了一个好的: http : //introcs.cs.princeton.edu/java/51data/CRC16CCITT.java.html

 public class CRC16CCITT { public static void main(String[] args) { int crc = 0xFFFF; // initial value int polynomial = 0x1021; // 0001 0000 0010 0001 (0, 5, 12) // byte[] testBytes = "123456789".getBytes("ASCII"); byte[] bytes = args[0].getBytes(); for (byte b : bytes) { for (int i = 0; i > (7-i) & 1) == 1); boolean c15 = ((crc >> 15 & 1) == 1); crc <<= 1; if (c15 ^ bit) crc ^= polynomial; } } crc &= 0xffff; System.out.println("CRC16-CCITT = " + Integer.toHexString(crc)); } } 

但这不适用于我的C代码。

是否有人能够为C和Java等效算法提供适应性或解决方案? 谢谢!

在这种情况下,java和c之间的主要区别在于c使用无符号数,而java只有有符号数。 虽然您可以使用带符号的数字实现相同的算法,但您必须注意符号位在移位操作中被转移的事实,需要额外的“和”。

这是我的实现:

 static int crc16(final byte[] buffer) { int crc = 0xFFFF; for (int j = 0; j < buffer.length ; j++) { crc = ((crc >>> 8) | (crc << 8) )& 0xffff; crc ^= (buffer[j] & 0xff);//byte to int, trunc sign crc ^= ((crc & 0xff) >> 4); crc ^= (crc << 12) & 0xffff; crc ^= ((crc & 0xFF) << 5) & 0xffff; } crc &= 0xffff; return crc; }