Entwickler-Ecke
C# - Die Sprache - CRC16 Algo von C nach C# portieren
Tobiask - Mi 27.02.08 14:54
Titel: CRC16 Algo von C nach C# portieren
Hallo,
ich habe zur Zeit einen CRC16 Algorithmus der wie folgt aussieht:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| //****************************************************************************** //* CrcByte (CRC berechnen) //****************************************************************************** void CrcByte(unsigned char byte) { // fast bit by bit algorithm without augmented zero bytes. // does not use lookup table, suited for polynom orders between 1...32.
unsigned int c, j, bit;
c = (unsigned int) byte; for (j = 0x0001; j < 0x0100; j <<= 1) { bit = Crc & 0x8000; Crc <<= 1; if (c & j) bit ^= 0x8000; if (bit) Crc ^= CRCPOLY; } } |
diesen möchte ich gerne in C# haben, das habe ich jetzt so umgesetzt:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| void CrcByte( byte b ) { ushort c, j, bit; c = (ushort)b;
for( j = 0x0001; j < 0x0100; j <<= 1 ) { bit = (ushort)( Crc & 0x8000 ); Crc <<= 1; bool bcj = Convert.ToBoolean( ( c & j ) ); if( bcj ) bit ^= 0x8000; bool bbit = Convert.ToBoolean( bit ); if( bbit ) Crc ^= CRCPOLY; } } |
Das Problem ist, der C# Algo gibt falsche Werte zurück... Kann jemand den Fehler finden, ich steh auf´m Schlauch ;)
Crc ist vom Typ ushort und global definiert, CRCPOLY ist ebenfalls ushort (const) und 0x1021
Gebe ich 0x01 ein müsste als Ergebnis 0x1189 herauskommen, tut es im C Programm auch, im C# Programm allerdings nicht... dort erhalte ich 0x9188
Moderiert von
Christian S.: Topic aus Algorithmen, Optimierung und Assembler verschoben am Mi 27.02.2008 um 14:59
Kha - Mi 27.02.08 18:33
Ich sehe jedenfalls keinen Übersetzungsfehler. Wenn es anderen auch so geht, bleibt dir wohl nur eines übrig: Parallel debuggen und bei der ersten Abweichung von Hand nachrechnen ;) .
[add]
Wozu gebe ich mir überhaupt noch die Mühe...
[/add]
[add id="1"]
Ehm... talla hat nicht wirklich genau die gleiche Antwort gegeben, noch bevor dieser Thread hier überhaupt erst erstellt wurde? Ich kapituliere vor der Dreistigkeit.
[/add]
Ralf Jansen - Do 28.02.08 00:21
unsigned int ist ein 32bit Integer, ushort aber nur 16bit.
Da das ein CRC16 sein soll vermute ich mal (Achtung gefährliches Halbwissen) das eher dein C Version falsch ist und nicht die in C#.
Christian S. - Do 28.02.08 00:34
@Khabarakh: Dann verlinke doch zumindest auf den Thread, wenn Du schon moserst :roll:
http://www.mycsharp.de/wbb2/thread.php?threadid=51773
@Tobiask: Wenn Du in zwei Foren fragst, dann verlinke bitte auf den jeweils anderen Thread, damit nicht jemand eine Antwort schreibt, die woanders schon gegeben wurde. :mahn:
Ralf Jansen - Do 28.02.08 12:49
Jein ;)
Auf seinem Microcontroller mag das Stimmen das dessen Registerbreite 16bit ist und damit eben unsigned int 16bittig ist.
Aber den CRC Wert den er für seine C Version angibt erhält man nur wenn das ein 32bit Datentyp ist, ergo
muß unsigned int auf dem System auf dem er das ausprobiert hat auch 32bittig sein(darum auch meine Anmerkung ob nicht eher die C Version falsch ist und nicht die in C#)
Kha - Do 28.02.08 17:42
Achso, du hast es mit 32 Bit ausprobiert - und da hast du Recht, das ergibt dann wirklich 0x9188.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!