Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi DEC 5.1 CRC-32 vs WinRAR CRC-32 (https://www.delphipraxis.net/82208-dec-5-1-crc-32-vs-winrar-crc-32-a.html)

Balu der Bär 8. Dez 2006 16:18


DEC 5.1 CRC-32 vs WinRAR CRC-32
 
Moin,

ich nutze Hagens CRC-Unit um einen CRC-Check in mein Programm einzubauen:
Delphi-Quellcode:
function GetCRC32Check(FileName:String): String;
var
  FS: TFileStream;
  CRC32: Cardinal;
begin
  FS := TFileStream.Create(FileName, fmOpenRead);
  try
    CRC32 := CRCCalcEx(CRC_32CCITT, FS.Read);
  finally
    FS.Free;
  end;
  result:=IntToHex(CRC32, 4);
end;
Das funktioniert auch bestens, nur leider ist der Ergebniswert dieser Funktion völlig anders als die CRC32-Werte, die mir WinRAR anzeigt. Eigentlich dachte ich ein CRC-Check wäre eindeutig, oder mache ich irgendwo etwas falsch? :gruebel:

St.Pauli 8. Dez 2006 16:35

Re: DEC 5.1 CRC-32 vs WinRAR CRC-32
 
Es gibt nicht einen CRC-Wert. Das Ergebnis des CRC-Hashverfahrens hängt vom verwendeten Startwert, XOR-Endwert und Polynom ab. Das heißt du musst herausfinden wie der CRC-Wert bei WinRar ermittelt wird und diese Parameter dann der DEC übergeben.

Balu der Bär 8. Dez 2006 16:53

Re: DEC 5.1 CRC-32 vs WinRAR CRC-32
 
Tatsächlich? Ich dachte ein CRC32-Check wäre wie ein MD5-Hash einmalig und eindeutig...

Aber ok, dann ist ja alles ok, danke. :-)

St.Pauli 8. Dez 2006 17:46

Re: DEC 5.1 CRC-32 vs WinRAR CRC-32
 
Probier mal folgendes:
  • Startwert: $FFFFFFFF
  • Finaler XOR-Wert: $FFFFFFFF
  • Polynom: $EDB88320

negaH 8. Dez 2006 22:20

Re: DEC 5.1 CRC-32 vs WinRAR CRC-32
 
Delphi-Quellcode:
function GetCRC32Check(FileName:String): String;

  function Swap(Value: Cardinal): Cardinal;
  asm
     BSWAP EAX
  end;

var
  FS: TFileStream;
  CRC: TCRCDef;
begin
  FS := TFileStream.Create(FileName, fmOpenRead);
  try
    CRCSetup(CRC, $EDB88320, 32, $FFFFFFFF, $FFFFFFFF, True/False);
    CRCCodeEx(CRC, FS.Read);
    Result := IntToHex(Swap(CRCDone(CRC)), 4);
  finally
    FS.Free;
  end;
end;
1.) das Polynom $EDB88320 ist nicht das CCITT Polynom
2.) im obigen CRCSetup() den True/False Parameter testen
3.) das Swap() eventuell weglassen, ich meine das die Big Endian benutzen
4.) ob das Polynom $EDB88320 richtig ist weis ich allerdings nicht

Gruß Hagen

Balu der Bär 9. Dez 2006 07:15

Re: DEC 5.1 CRC-32 vs WinRAR CRC-32
 
Danke euch beiden, ich werde das später mal testen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz