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.
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier gehen wir; beachten Sie, dass dies ist ein spezifische Aroma der CRC-16 - es ist verwirrend zu sagen, dass das nur "CRC-16". Dieser leiht Umsetzung einige Besonderheiten aus http://www.sanity-free.com/ - Hinweis habe ich es
static
eher als Instanz-basiert.result[i] = Convert.ToByte(input.Substring(2 * i, 2), 16);
zweiten Parameter erwartet einenSystem.IFormatProvider
Wert, der die 16 ist offenbar nicht einer von Ihnen.Darüber Hinaus, Wenn Sie wollen, CRC16-CCITT.