我目前正在开展一个项目,有一个嵌入式系统通过无线电将数据发送到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;
}
Run Code Online (Sandbox Code Playgroud)
现在我正在寻找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));
}
}
Run Code Online (Sandbox Code Playgroud)
但这不适用于我的C代码.
有人能够为C和Java等效算法提供适应性或解决方案吗?谢谢!
the*_*dor 23
在这种情况下,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;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
18994 次 |
最近记录: |