So erzeugen Sie eine CRC-16 von C#

Ich versuche zu generieren, die eine CRC-16 mit C#. Die hardware, die ich benutze für RS232 erfordert die Eingabe-string, HEX. Die Abbildung unten zeigt die korrekte Konvertierung, Für einen test brauche ich 8000 werden 0xC061, jedoch sind die C# - Methode, generiert der CRC-16 muss in der Lage sein zu konvertieren bestimmten HEX-string.

So erzeugen Sie eine CRC-16 von C#

Habe ich versucht, mit Nito.KitchenSink.CRC

Ich habe auch versucht, die unten generiert 8009 bei 8000 eingegeben wird -

public string CalcCRC16(string strInput)
    {
        ushort crc = 0x0000;
        byte[] data = GetBytesFromHexString(strInput);
        for (int i = 0; i < data.Length; i++)
        {
            crc ^= (ushort)(data[i] << 8);
            for (int j = 0; j < 8; j++)
            {
                if ((crc & 0x8000) > 0)
                    crc = (ushort)((crc << 1) ^ 0x8005);
                else
                    crc <<= 1;
            }
        }
        return crc.ToString("X4");
    }

    public Byte[] GetBytesFromHexString(string strInput)
    {
        Byte[] bytArOutput = new Byte[] { };
        if (!string.IsNullOrEmpty(strInput) && strInput.Length % 2 == 0)
        {
            SoapHexBinary hexBinary = null;
            try
            {
                hexBinary = SoapHexBinary.Parse(strInput);
                if (hexBinary != null)
                {
                    bytArOutput = hexBinary.Value;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        return bytArOutput;
    }
  • Okay, so gibt es einige code zum erzeugen einer CRC (nehme ich an). Was ist das konkrete problem/Frage?
  • Das problem ist die generierte CRC ist falsch usign der code oben. Ich werde zu aktualisieren, die Frage mit seiner aktuellen Ausgabe.
  • Der Eingang "8000" - ist, dass 8000 dezimal, hex 8000, oder ein string "8000" ?
  • Das Gerät verlangt, HEX
  • Nein, das ist nicht die Frage; Computer eigentlich nicht sprechen in hex oder dezimal oder sonst etwas. Sie müssen nur zahlen. Was ich wissen muss ist: was tun Sie (nicht die Maschine) Mittelwert von 8000? CRC-läuft auf Byte. Ich muss wissen, welche byte-Reihenfolge, wir sind hashing. Ich kann interpretieren, 8000 über 15 byte-Sequenzen, ohne sogar zu versuchen. Ich muss wissen, welche.
  • Sorry, wenn man sich den screenshot, den HEX-radio-button markiert ist. Ich gebe dann 8000 und die erzeugten CRC, die ich verlangen, ist 0xC061. Die 8000 ist ein string, mit zu beginnen.
  • Ich werde immer ein string-hashing
  • Nein, werden Sie immer hashing bytes. Hashes arbeiten an bytes, keine strings. Um auf bytes, müssen Sie wissen, die encoding-Regeln. Wird diese ASCII? d.h. "8000" => {56, 48, 48, 48} ?
  • Zur info, das CRC-16 algo gepostet, dass ich (jetzt gelöscht) ist das CRC-CCITT (XModem) algo, aka CRC16 ISO 13239. Ich werde sehen, ob ich finden kann, die algo erzeugt das andere Ergebnis
  • Alles was ich weiß ist das Gerät sendet HEX-Wert als string über die RS-232-und ich Sie abholen. Ich habe bereits eine Methode konvertiert einen string zu byte [], und ich senden von Nachrichten an das Gerät zurück, mit einer Methode, die gibt einen HEX-string. Das Gerät versteht und alles Prima funktioniert, ich muss einfach zu implementieren CRC-Prüfung auf strings gesendet vom Gerät zum PC. Cheers

InformationsquelleAutor dynamicuser | 2014-04-04
Schreibe einen Kommentar