![]() |
CRC32 mit DEC erzeugt stimmt nicht?
Hallo,
ich benutze das DEC von Hagen. Ich habe eine Textdatei die nur den String 123456789 enthält. Erzeuge ich mit der folgenden Funktion den CRC32, erhalte ich 340BC6D9.
Delphi-Quellcode:
Wenn ich jedoch mit dieser Funktion mit dem selben String 123456789 den CRC32 erzeuge, erhalte ich CBF43926.
function CRC32CalcFile(const FileName:String): String;
var FS: TFileStream; begin FS := TFileStream.Create(FileName, fmOpenRead); try result := IntToHex(CRCCalcEx(CRC_32CCITT, FS.Read), 4); finally FS.Free; end; end;
Delphi-Quellcode:
Müssten nicht bei beiden Funktionen CBF43926 zurückgegeben werden? Laut den Webseiten
const
Buf = '123456789'; result := IntToHex(CRCCalc(CRC_32CCITT, PAnsiChar(Buf)^, Length(Buf)), 4); ![]() ![]() |
Re: CRC32 mit DEC erzeugt stimmt nicht?
du mußt auch das richtige Polynom zur Berechnung verwenden
also vermutlich statt CRC_32CCITT irgendwas Anderes am Häufigsten wird einer dieser beiden Polynome verwendet > $EDB88320 oder $04C11DB7 ich weiß jetzt aber nicht, welchem Typ diese in Hagens DEC entsprechen. [add] ps: ![]() |
Re: CRC32 mit DEC erzeugt stimmt nicht?
Zitat:
|
Re: CRC32 mit DEC erzeugt stimmt nicht?
hmmm, dann stimmt wohl etwas nicht :gruebel:
du weißt, daß Buf in diesem Fall ein UnicodeString ist?
Delphi-Quellcode:
also ist Buf bei dir effektiv nur
const
Buf = '123456789'; result := IntToHex(CRCCalc(CRC_32CCITT, PAnsiChar(Buf)^, Length(Buf)), 4);
Delphi-Quellcode:
#wobei PAnsiChar und ein WideString nicht so gut passen und da sollte es eigentlich eine Meldung seitens Delphi geben :gruebel:
Buf = AnsiString('1'#0'2'#0'3'#0'4'#0'5');
versuch mal
Delphi-Quellcode:
const
Buf: AnsiString = '123456789'; result := IntToHex(CRCCalc(CRC_32CCITT, PAnsiChar(Buf)^, Length(Buf)), 4); |
Re: CRC32 mit DEC erzeugt stimmt nicht?
Versuchs mal mit CRC_32 statt CRC_32CCITT.
|
Re: CRC32 mit DEC erzeugt stimmt nicht?
Zitat:
|
Re: CRC32 mit DEC erzeugt stimmt nicht?
Zitat:
|
Re: CRC32 mit DEC erzeugt stimmt nicht?
Üblicherweise wird die CRC-Summe vor der Berechnung mit -1 initialisiert (alle Bits gesetzt).
Man kann aber auch mit 0 beginnen (alle Bits nicht gesetzt). Um auf das gleiche Ergebnis zu kommen, muss das Ergebnis negiert werden. $340BC6D9 xor $FFFFFFFF = $CBF43926 oder $340BC6D9 xor -1 = $CBF43926 |
Re: CRC32 mit DEC erzeugt stimmt nicht?
Die Erklärung für die unterschiedlichen CRC-Werte hat himitsu doch schon gegeben. Wenn in Deiner Datei die neun Asciizeichen '1'..'9' bzw #49..#57 stehen, und die CRC $CBF43926 sein soll, so muss definitiv diese CRC genommenen werden, mit folgenden Rocksoft-Parametern:
Code:
CRC32_Zip: TCRCParam = (poly : longint($04C11DB7);
init : longint($FFFFFFFF); xorout : longint($FFFFFFFF); check : longint($CBF43926); width : 32; refin : true; refout : true; name : 'CRC32/Zip'); {alias : 'CRC-32'} {alias : 'CRC-32/ADCCP'} {alias : 'PKZIP'} Und beim DEC ist das nun mal CRC_32. Schreib mal Deinen String in eine Datei und schau nach, was als Bytes drin steht. Im übrigen ist es eh nicht gut, CRCs auf Strings loszulassen, wenn man nicht weiß, was eigentlich unter der Hand passiert. Leider verschleiern das viele Blackbox-Bibliotheken. |
Re: CRC32 mit DEC erzeugt stimmt nicht?
Danke, mit der Lösung von Blup klappt es!
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz