如何从 ISO FDX-B 微芯片数据计算 CRC-CCITT
How to Calculate CRC-CCITT from ISO FDX-B microchip data
我无法为 ISO FDX-B 兼容微芯片中存储的 64 位数据计算正确的 CRC 值。我知道正确的 CRC 应该是 0x73f9。任何帮助将不胜感激。
原始数据为:
Forward LSB - MSB
00010011 10000010 00011100 00101000 01011010 01101111 00000000 00000001
19 130 28 40 90 111 0 1
Reverse MSB - LSB
10000000 00000000 11110110 01011010 00010100 00111000 01000001 11001000
128 0 246 90 20 56 65 200
我恭敬地把它输入到例程 crc16 中;
byte[] y = { (byte)19, (byte)130, (byte)28, (byte)40, (byte)90, (byte)111, (byte)0, (byte)1 };
crc = crc16(y);
// crc = oxa7f0;
byte[] x = { (byte)128, (byte)0, (byte)246, (byte)90, (byte)20, (byte)56, (byte)65 , (byte)200};
int crc = crc16(x);
// crc = 0x1438
这是 crc 例程:
// Calculates the 16 bit CRC value of the byte buffer
public static int crc16(byte[] bytes)
{
int crc = 0x0; // initial value
int polynomial = 0x1021; // 0001 0000 0010 0001 (0, 5, 12)
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;
return crc;
}
在 Arduino 社区的帮助下,我能够生成正确的校验和。该算法是正确的,解决方案是从初始值 0 开始,一个 0x1021 的多边形,然后将计算值进行位反转。这样做 returns 计算得出的 0x9FCE 校验和和位反转给出预期的校验和 0x73F9。我已经更新了上面的代码。
1001 1111 1100 1110
9 F C E
7 3 F 9
0111 0011 1111 1001
我无法为 ISO FDX-B 兼容微芯片中存储的 64 位数据计算正确的 CRC 值。我知道正确的 CRC 应该是 0x73f9。任何帮助将不胜感激。
原始数据为:
Forward LSB - MSB
00010011 10000010 00011100 00101000 01011010 01101111 00000000 00000001
19 130 28 40 90 111 0 1
Reverse MSB - LSB
10000000 00000000 11110110 01011010 00010100 00111000 01000001 11001000
128 0 246 90 20 56 65 200
我恭敬地把它输入到例程 crc16 中;
byte[] y = { (byte)19, (byte)130, (byte)28, (byte)40, (byte)90, (byte)111, (byte)0, (byte)1 };
crc = crc16(y);
// crc = oxa7f0;
byte[] x = { (byte)128, (byte)0, (byte)246, (byte)90, (byte)20, (byte)56, (byte)65 , (byte)200};
int crc = crc16(x);
// crc = 0x1438
这是 crc 例程:
// Calculates the 16 bit CRC value of the byte buffer
public static int crc16(byte[] bytes)
{
int crc = 0x0; // initial value
int polynomial = 0x1021; // 0001 0000 0010 0001 (0, 5, 12)
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;
return crc;
}
在 Arduino 社区的帮助下,我能够生成正确的校验和。该算法是正确的,解决方案是从初始值 0 开始,一个 0x1021 的多边形,然后将计算值进行位反转。这样做 returns 计算得出的 0x9FCE 校验和和位反转给出预期的校验和 0x73F9。我已经更新了上面的代码。
1001 1111 1100 1110
9 F C E
7 3 F 9
0111 0011 1111 1001