2 Stimmen

Wie berechnet man CRC_B in C#

Wie berechnet man die CRC_B-Kodierung in C#, wie in ISO 14443 beschrieben? Hier sind einige Hintergrundinformationen:

CRC_B-Kodierung Dieser Anhang dient der Erläuterung und gibt die Bitmuster an, die in der physikalischen Schicht vorhanden sind. Er dient der Überprüfung einer ISO/IEC 14443-3 Typ B Implementierung der CRC_B-Kodierung zu überprüfen. Siehe ISO/IEC 3309 und CCITT X.25 2.2.7 und V.42 8.1.1.6.1 für weitere Einzelheiten. Anfangswert = 'FFFF'

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

Ich habe einige zufällige CRC16-Bibliotheken ausprobiert, aber sie liefern mir nicht die gleichen Ergebnisse. Auch die Online-Prüfungen ergaben nicht die gleichen Ergebnisse wie in aquí .

2voto

cfeduke Punkte 22720

Ich habe dies aus dem C-Code in ISO/IEC JTC1/SC17 N 3497 Es ist also nicht schön, aber es 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;
    }
}

Probieren Sie testweise den folgenden Code aus:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X