2017-03-16 55 views
0

我无法计算存储在ISO FDX-B投诉芯片中的64位数据的正确CRC值。我知道正确的CRC应该是0x73f9。任何帮助,将不胜感激。如何根据ISO FDX-B芯片数据计算CRC-CCITT

的原始数据是:

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; 
} 

回答

0

与Arduino的社区我是能够产生正确的校验一些帮助。该算法是正确的,解决的办法是从初始值0开始,一个0x1021的多边形,然后反转计算的值。这样做会返回0x9FCE的计算校验和和位反转,从而得到预期的校验和0x73F9。我已经更新了上面的代码。

1001 1111 1100 1110 
9 F C E 

7  3  F  9 
0111 0011 1111 1001