2017-03-16 58 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