2017-03-16 3 views
0

J'ai des difficultés à calculer la valeur CRC correcte pour les données de 64 bits stockées dans une micropuce de plainte ISO FDX-B. Je sais que le CRC correct devrait être 0x73f9. Toute aide serait appréciée.Comment calculer CRC-CCITT à partir de données de micropuce ISO FDX-B

Les données brutes sont:

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 

I alimenter cette routine dans un CRC16 respectueusement;

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 

est ici la routine 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; 
} 

Répondre

0

Avec l'aide de la communauté Arduino je suis en mesure de générer la somme de contrôle correcte. L'algorithme est correct et la solution est de commencer avec une valeur initiale de 0, un poly de 0x1021, puis inverser bit la valeur calculée. Cela retourne une somme de contrôle calculée de 0x9FCE et l'inversion de bit qui donne la somme de contrôle attendue 0x73F9. J'ai mis à jour le code ci-dessus.

1001 1111 1100 1110 
9 F C E 

7  3  F  9 
0111 0011 1111 1001