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
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
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
:
wird für die Arbeit die einzige Untersuchung, die hier gegeben http://www.ite.org/standards/1203v03-04%20Part%201%20dms2011.pdf (etwa Seite 158
CRC = 0x52ED
).Für die string-Beispiel PDF-Datei geschrieben, einige Seiten später:
(Hervorhebung Hinzugefügt)
also:
Zeigt dies, dass das Protokoll ist little-endian (als mein PC, ein Intel). In der Tat wird der CRC-16 der string ist 0xF995, aber diese 16 bits in den Speicher erscheinen als 0x95 0xF9 (wie im Beispiel), zeigt, dass die einzelnen bytes).
Er arbeitete hier für diese spezifische byte-array, Für mich ist es noch unklar, wie die Arbeit mit diesem string...
Ich Fand eine Sache, die auf dieses Dokument auf der Seite 175, Meldung CRC Parameter, Gibt die CRC-16 (Polynom definiert in ISO/IEC 3309) Wert erstellt, mit den Werten der dmsMessageMultiString (MULTI-Message), die dmsMessageBeacon, und die dmsMessagePixelService die Objekte in der Reihenfolge aufgelistet...
Gefunden!!! Sie können den zusätzlichen test. Der Algorithmus wurde korrekt. Das problem war, wie zu Komponieren string.
Danke Mann, dass es wirklich funktioniert hier.
InformationsquelleAutor xanatos
Es gibt viele algorithmen für den CRC-16-Berechnung.
Zum Beispiel:
Ich verwende CRC-16-die IBM in meinen Anwendungen, die die Arbeit mit industriellen Controllern.
InformationsquelleAutor Artem Tsetkhalin