Frage

Wie CRC_B Codierung in C # berechnen, wie in ISO 14443 beschrieben? Hier finden Sie einige Hintergrundinformationen:

  

CRC_B Codierung   Dieser Anhang ist zu Erläuterungszwecken vorgesehen und zeigt die Bitmuster das wird   in der physikalischen Schicht existiert. Es ist für die Zwecke der Überprüfung eines ISO / IEC enthalten   14443-3 Typ B Implementierung von CRC_B Codierung. Siehe ISO / IEC 3309 und CCITT X.25   2.2.7 und V.42 8.1.1.6.1 für weitere Details. Anfangswert = 'FFFF'

  • Beispiel 1: für 0x00 0x00 0x00 Sie mit CRC_B von 0xCC 0xC6 sollten am Ende
  • Beispiel 2: für 0x0F 0xAA 0xFF sollten Sie mit CRC_B 0xFC 0xD1 am Ende

Ich habe versucht, einige zufällige CRC16 Bibliotheken, aber sie geben mir nicht die gleichen Ergebnisse. Ich habe nicht die gleichen Ergebnisse von Online-Prüfungen erhalten entweder wie in hier .

War es hilfreich?

Lösung

ich umgekehrt diese aus dem C-Code in ISO / IEC JTC1 / SC17 N 3497 so es ist nicht schön, aber das tut, was Sie brauchen:

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

Als Test versuchen, den Code unten:

 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();
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top