将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 << 8);

crc ^= *buffer++;

crc ^= ((unsigned char) 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 < 8; i++) {

boolean bit = ((b >> (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;

}

以上是 将C CRC16转换为Java CRC16 的全部内容, 来源链接: utcz.com/qa/405198.html

回到顶部