AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

CRC32 mit DEC erzeugt stimmt nicht?

Ein Thema von BlueStarHH · begonnen am 24. Jul 2009 · letzter Beitrag vom 21. Aug 2010
Antwort Antwort
Seite 1 von 2  1 2      
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
848 Beiträge
 
Delphi 11 Alexandria
 
#1

CRC32 mit DEC erzeugt stimmt nicht?

  Alt 24. Jul 2009, 13:32
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:
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;
Wenn ich jedoch mit dieser Funktion mit dem selben String 123456789 den CRC32 erzeuge, erhalte ich CBF43926.

Delphi-Quellcode:
const
  Buf = '123456789';

  result := IntToHex(CRCCalc(CRC_32CCITT, PAnsiChar(Buf)^, Length(Buf)), 4);
Müssten nicht bei beiden Funktionen CBF43926 zurückgegeben werden? Laut den Webseiten http://www.pvlteam.com/doc/crc/testonline.aspx und
http://www.hashsum.com ist CBF43926 der richtige CRC32. Die erste Webseite sagt, dass 340BC6D9 ein CRC32_jamcrc ist. Was muss geändert werden, damit ich auch bei der Datei CBF43926 herausbekomme? Danke!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#2

Re: CRC32 mit DEC erzeugt stimmt nicht?

  Alt 24. Jul 2009, 13:45
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: http://www.delphipraxis.net/internal...=991917#991917
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
848 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: CRC32 mit DEC erzeugt stimmt nicht?

  Alt 24. Jul 2009, 14:01
Zitat von himitsu:
du mußt auch das richtige Polynom zur Berechnung verwenden

also vermutlich statt CRC_32CCITT irgendwas
Ich verwende ja in meinen beiden Funktione das selbe Polynom (CRC_32CCITT). Also müsste doch bei meinen beiden Funktionen das selbe rauskommen. CRC_32CCITT ($04C11DB7) stimmt laut verschiedener Webseiten.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#4

Re: CRC32 mit DEC erzeugt stimmt nicht?

  Alt 24. Jul 2009, 14:10
hmmm, dann stimmt wohl etwas nicht


du weißt, daß Buf in diesem Fall ein UnicodeString ist?
Delphi-Quellcode:
const
  Buf = '123456789';

  result := IntToHex(CRCCalc(CRC_32CCITT, PAnsiChar(Buf)^, Length(Buf)), 4);
also ist Buf bei dir effektiv nur
Buf = AnsiString('1'#0'2'#0'3'#0'4'#0'5'); #wobei PAnsiChar und ein WideString nicht so gut passen und da sollte es eigentlich eine Meldung seitens Delphi geben


versuch mal
Delphi-Quellcode:
const
  Buf: AnsiString = '123456789';

  result := IntToHex(CRCCalc(CRC_32CCITT, PAnsiChar(Buf)^, Length(Buf)), 4);
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#5

Re: CRC32 mit DEC erzeugt stimmt nicht?

  Alt 24. Jul 2009, 14:15
Versuchs mal mit CRC_32 statt CRC_32CCITT.
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
848 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: CRC32 mit DEC erzeugt stimmt nicht?

  Alt 24. Jul 2009, 15:05
Zitat von himitsu:
versuch mal
Delphi-Quellcode:
const
  Buf: AnsiString = '123456789';

  result := IntToHex(CRCCalc(CRC_32CCITT, PAnsiChar(Buf)^, Length(Buf)), 4);
Klappt auch nicht. Beide Funktionen liefern ein anderen CRC. Der CRC vom oberen Code stimmt ja. Nur die CRC32CalcFile aus meinem Eingangspost liefert einen falschen Wert.
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
848 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: CRC32 mit DEC erzeugt stimmt nicht?

  Alt 24. Jul 2009, 15:07
Zitat von gammatester:
Versuchs mal mit CRC_32 statt CRC_32CCITT.
Auch damit liefern beide Funktionen einen unterschiedlichen Wert. Ich glaube nicht das es am Polynom liegt, den beim selben Polynom (egal ob CRC_32, CRC_32CCITT oder was auch immer) müssen beide Funktionen das selbe Ergebnis liefern.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#8

Re: CRC32 mit DEC erzeugt stimmt nicht?

  Alt 24. Jul 2009, 15:31
Ü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
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#9

Re: CRC32 mit DEC erzeugt stimmt nicht?

  Alt 24. Jul 2009, 16:24
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.
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
848 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: CRC32 mit DEC erzeugt stimmt nicht?

  Alt 24. Jul 2009, 16:24
Danke, mit der Lösung von Blup klappt es!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:30 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