Question

Comment calculer le codage CRC_B en C # comme décrit dans ISO 14443? Voici quelques informations de base:

  

Codage CRC_B   Cette annexe est fournie à des fins d’explication et indique les modèles de bits qui seront utilisés.   existent dans la couche physique. Il est inclus dans le but de vérifier un ISO / IEC   14443-3 Implémentation de type B du codage CRC_B. Voir ISO / IEC 3309 et CCITT X.25   2.2.7 et V.42 8.1.1.6.1 pour plus de détails. Valeur initiale = 'FFFF'

  • Exemple 1: pour 0x00 0x00 0x00, vous devriez vous retrouver avec CRC_B de 0xCC 0xC6
  • Exemple 2: pour 0x0F 0xAA 0xFF, vous devez vous retrouver avec CRC_B de 0xFC 0xD1

J'ai essayé des bibliothèques CRC16 aléatoires, mais elles ne me donnent pas les mêmes résultats. Les chèques en ligne ne donnent pas les mêmes résultats que dans ici .

Était-ce utile?

La solution

Je l'ai inversé à partir du code C dans ISO / IEC JTC1 / SC17 N 3497 . ce n’est pas beau mais fait ce dont vous avez besoin:

public class CrcB
{
    const ushort __crcBDefault = 0xffff;

    private static ushort UpdateCrc(byte b, ushort crc)
    {
            unchecked
            {
                byte ch = (byte)(b^(byte)(crc & 0x00ff));
                ch = (byte)(ch ^ (ch << 4));
                return (ushort)((crc >> 8)^(ch << 8)^(ch << 3)^(ch >> 4));
            }
    }

    public static ushort ComputeCrc(byte[] bytes)
    {
            var res = __crcBDefault;
            foreach (var b in bytes)
                    res = UpdateCrc(b, res);
            return (ushort)~res;
    }
}

Comme test, essayez le code ci-dessous:

 public static void Main(string[] args) 
 {
     // test case 1 0xFC, 0xD1
     var bytes = new byte[] { 0x0F, 0xAA, 0xFF };
     var crc = CrcB.ComputeCrc(bytes);
     var cbytes = BitConverter.GetBytes(crc);

     Console.WriteLine("First (0xFC): {0:X}\tSecond (0xD1): {1:X}", cbytes[0], cbytes[1]);

     // test case 2 0xCC, 0xC6
     bytes = new byte[] { 0x00, 0x00, 0x00 };
     crc = CrcB.ComputeCrc(bytes);
     cbytes = BitConverter.GetBytes(crc);
     Console.WriteLine("First (0xCC): {0:X}\tSecond (0xC6): {1:X}", cbytes[0], cbytes[1]);


     Console.ReadLine();
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top