我正在修改that一段代碼以使其可以使用任意值和長度。使用任意值和長度的CRC計算
我至今修改:
public static int ModRTU_CRC(final byte[] buf, int crc)
{
final int len = buf.length;
for (int pos = 0; pos < len; pos++)
{
crc ^= buf[pos]; // XOR byte into least sig. byte of crc
for (int i = 8; i != 0; i--)
{ // Loop over each bit
if ((crc & 0x0001) != 0)
{ // If the LSB is set
crc >>= 1; // Shift right and XOR 0xA001
crc ^= 0xA001;
}
else
{
// Else LSB is not set
crc >>= 1; // Just shift right
}
}
}
// Note, this number has low and high bytes swapped, so use it
// accordingly (or swap bytes)
return crc;
}
我測試我的代碼以下列方式:
final String a = "1101011011";
final String crc = "10011";
final int parsedA = Integer.parseInt(a, 2);
final ByteBuffer parsedBytes = ByteBuffer.allocate(4).putInt(parsedA);
final byte[] array = parsedBytes.array();
final int parsedCRC = Integer.parseInt(crc, 2);
System.out.println(Integer.toBinaryString(ModRTU_CRC(array, parsedCRC)));
我得到1000111101000101
但正確答案是11010110111110
。即使我交換字節,我也沒有達到目標。你能幫我弄清楚我犯了什麼錯誤嗎?
在鏈接代碼中,'crc'從0xFFFF開始,但是在這裏它開始於我們在代碼中看不到的其他值(取決於'b'的值)。它是否正確? – immibis
正確,crc取決於b的值。在這種情況下'crc'將會是'0x13'。 –
問題中的代碼不顯示「b」的值,因此您可能需要添加該值。另外,你是怎麼計算出「11010110111110」是正確答案的?另外,除了'crc'的起始值之外,這段代碼和鏈接代碼之間是否有區別? – immibis