CRC16 ISO 13239 Umsetzung

ich versuche, umzusetzen Crc16 in C#. Ich habe bereits versucht, viele verschiedene Implementierungen, aber die meisten von Ihnen gibt mir andere Werte. Hier sind einige der codes, die ich bereits verwendet.

    private static int POLYNOMIAL = 0x8408;
    private static int PRESET_VALUE = 0xFFFF;

    public static int crc16(byte[] data)
    {
        int current_crc_value = PRESET_VALUE;
        for (int i = 0; i < data.Length; i++)
        {
            current_crc_value ^= data[i] & 0xFF;
            for (int j = 0; j < 8; j++)
            {
                if ((current_crc_value & 1) != 0)
                {
                    current_crc_value = (current_crc_value >> 1) ^ POLYNOMIAL;
                }
                else
                {
                    current_crc_value = current_crc_value >> 1;
                }
            }
        }
        current_crc_value = ~current_crc_value;

        return current_crc_value & 0xFFFF;
    }

dies ist eine weitere Implementierung, die ich verwendet, aber beide gibt verschiedene Werte

    const ushort polynomial = 0xA001;
    ushort[] table = new ushort[256];

    public ushort ComputeChecksum(byte[] bytes)
    {
        ushort crc = 0;
        for (int i = 0; i < bytes.Length; ++i)
        {
            byte index = (byte)(crc ^ bytes[i]);
            crc = (ushort)((crc >> 8) ^ table[index]);
        }
        return crc;
    }

    public byte[] ComputeChecksumBytes(byte[] bytes)
    {
        ushort crc = ComputeChecksum(bytes);
        return BitConverter.GetBytes(crc);
    }

    public Crc16()
    {
        ushort value;
        ushort temp;
        for (ushort i = 0; i < table.Length; ++i)
        {
            value = 0;
            temp = i;
            for (byte j = 0; j < 8; ++j)
            {
                if (((value ^ temp) & 0x0001) != 0)
                {
                    value = (ushort)((value >> 1) ^ polynomial);
                }
                else
                {
                    value >>= 1;
                }
                temp >>= 1;
            }
            table[i] = value;
        }
    }

Den Wert, den ich verwende, ist ein Octet String "[jp3]TEST [fl]Blinken[/fl]" und dem erwarteten Wert 95F9 in hex. Dies ist ein Beispiel, der Führer der NTCIP Protokoll

Dank

es gibt viele mögliche Eingabeparameter für CRC-16. Es ist nicht ein einziger Algorithmus wie MD5. Aus diesem Grund, zum Beispiel, Ihre zwei Fragmente von zwei verschiedenen polynomial/POLYNOMIAL (und verschiedene andere Dinge)
Zum Beispiel auf dieser Seite lammertbies.nl/comm/info/crc-calculation.html verschiedene crc-16 verwendet, die von verschiedenen standards gezeigt.
Ich habe das Dokument, das Sie sprechen von: ite.org/standards/1203v03-04%20Part%201%20dms2011.pdf Leider gibt es nicht ein einziges echtes Beispiel dafür, wie die CRC-Berechnung.
Vielleicht habe ich gefunden, der Algorithmus. Er berechnet das nur die voll-Beispiel präsentieren.
Das einzige Beispiel zu diesem Dokument ist, wo es definiert ist, wie ich schon sagte, Der Algorithmus basiert auf dem CRC-16-Algorithmus definiert in ISO 13239:2002 hier auf Seite 118 ntcip.org/library/documents/pdf/1203v0239b_rs.pdf. Auch auf dieser Seite gibt es ein Beispiel für einen text und seinen Wert auf hex mit CRC16."95 F9 2-byte Prüfsumme Wert für ein MULTI-string-Wert '[jp3]TEST [fl]Blinken[/fl] "hex". Es ist immer noch nicht klar, wo ich suchen soll, oder auch, wie kann ich es machen

InformationsquelleAutor Fabio Reis | 2013-09-03

Schreibe einen Kommentar