![]() |
Re: CRC32 für einzelne Wörter!
Ansonsten nimmst du die Unit aus deinem ersten Link. Dort gibt es die Funktion "RecountCRC()" die du benutzen kannst.
Delphi-Quellcode:
Gruß Hagen
function RecountCRC(b: byte; CrcOld: Longint): Longint;
begin RecountCRC := CRCTable[byte(CrcOld xor Longint(b))] xor ((CrcOld shr 8) and $00FFFFFF) end; function CRCString(const Value: String): Cardinal; var I: Integer; begin Result := $FFFFFFFF; // Init Wert der CRC, schau im PHP nach for I := 1 to Length(Value) do Result := RecountCRC(Ord(Value[I]), Result); Result := not Result; // eventl. Finit Wert, schau im PHP nach end; |
Re: CRC32 für einzelne Wörter!
THX!!!
|
Re: CRC32 für einzelne Wörter!
Ist zwar schon etwas älter der Threat aber ich habe gerade genau das gleiche Problem. Habe einen String und möchte gerne eine CRC32 Prüfung machen. Leider ist die Unit vom ersten Link hier im Threat down. Weiß jemand eine Alternative?
|
Re: CRC32 für einzelne Wörter!
als Alternativen hätten wir noch
Hagen's ![]() ![]() ![]() HashLib! v1.03.exe ![]() vieles vieles mehr und im Notfall noch was von mir ![]()
Delphi-Quellcode:
der CRC32-Teil ließe sich auch "einfach" aus dem Projekt extrahieren
Var CRC32: ThxCRC32;
S: String; B: LongWord; CRC32.InitT; // notfalls das Polynom ändern, oder 'ne andere Tabelle laden CRC32.Calc('dein Wort'); S := CRC32.asHexString; //B := CRC32.asBin; // oder CRC32.InitT; // notfalls das Polynom ändern, oder 'ne andere Tabelle laden CRC32.Init; CRC32.Update('dein Wort'); CRC32.Final; S := CRC32.asHexString; //B := CRC32.asBin; |
Re: CRC32 für einzelne Wörter!
Hi himitsu, erstmal danke für die ausführliche Antwort. Am liebsten würde ich auf deinen letzten Vorschlag zurückkommen allerdings weiß ich nicht genau was ich alles aus deinem Projekt benötige. Du schreibst zwar, dass sich der CRC32-Teil auch "einfach" aus dem Projekt extrahieren lassen würde, denke aber, dass dies nicht ganz auf mich zutrifft :)
Zu dem was ich mache: Ich versuche mit der Snoop Component Suite Ethernet Pakete zu generieren. Der aktuelle Stand ist, dass der Rahmen fast komplett ist. Header, Länge und Daten sind bereits zu einem Hexstring verarbeitet. Mir fehlen jetzt "nur" noch die 4byte (CRC32-Checksumme) die ich zum Schluss als Hexstring anfügen möchte. dachte da an sowas:
Delphi-Quellcode:
function crc32(Datastring: String): Integer;
begin (...) end string := string + IntTohex(crc32(string)) |
Re: CRC32 für einzelne Wörter!
Liste der Anhänge anzeigen (Anzahl: 2)
Wenn du nur eine Funktion möchtest, dann mußt du dir allerdings selber was basteln,
da ich meine CRC32-Frunktionen ohne feste HashTabelle erstellt hab und diese muß erst initialisert werden. Nicht wundern, Aufgrund des internen Aufbaus ist wirklich kein freigeben (.Free) nötig. Und abgesehn vom CRC32 wird auch kein (.InitT aka .Create) benötigt.
Delphi-Quellcode:
oder so
Function MyCRC32(Datastring: String): String;
Var CRC32: ThxCRC32; Begin CRC32.InitT; Result := CRC32.Calc(S).asHexString; End aString := aString + MyCRC32(aString);
Delphi-Quellcode:
aber am Effektivsten sähe es dann so aus:
Function MyCRC32(Datastring: String; Polynom: LongWord = $EDB88320): String;
Var CRC32: ThxCRC32; Begin CRC32.InitT(Polynom); Result := CRC32.Calc(S).asHexString; End aString := aString + MyCRC32(aString, $12345678); (nicht jedesmal die HashTabelle neu berechnen)
Delphi-Quellcode:
Var CRC32: ThxCRC32;
CRC32.InitT; aString := aString + CRC32.Calc(aString).asHexString; aString := aString + CRC32.Calc(aString).asHexString; aString := aString + CRC32.Calc(aString).asHexString; hab das Ganze auch gleich mal an Delphi 2009 angepaßt und hoff es haben sich keine Fehler beim Umbau eingeschlichen. |
Re: CRC32 für einzelne Wörter!
Hab das gleich mal ausprobiert aber leider kommt bei mir bei allen drei Methoden eine mir bisher unbekannte Fehlermeldung [Pascal Fatal Error] Main.pas(250): F2084 Internal Error: URW821. Dein Beispielprojekt funktioniert allerding.
|
Re: CRC32 für einzelne Wörter!
Wie sieht denn dein TestCode aus und in welcher Delphiversion trat der Fehler auf?
füge mal in FHash_single und deine TestUnit nach dem "Interface" ein "{$INLINE OFF}" ein. (ich weiß jetzt leider nicht, wo dieser Schalter seine Auswirkung zeigt) vielleicht hilft's ja ... es kam anscheinend, im Zusammenhang mit mit einem ähnlichem Fehler, schonmal vor
Delphi-Quellcode:
Interface
{$INLINE OFF} ![]() |
Re: CRC32 für einzelne Wörter!
Also ich benutze Delphi2006. Nachdem ich bei beiden units
Delphi-Quellcode:
eingefügt habe kommt jetzt die Meldung
{$INLINE OFF}
Zitat:
und in meiner Main den Aufruf mit
Delphi-Quellcode:
zu
crcChecksum := MyCRC32(Datastring);
Delphi-Quellcode:
das Programm wird nur dann fertig compiliert wenn ich
// CRC-Prüfsumme berechnen
Function TForm1.MyCRC32(Datastring: String): String; var CRC32: ThxCRC32; begin CRC32.InitT; Result := CRC32.Calc(Datastring).asHexString; end;
Delphi-Quellcode:
auskommmentiere
Result := CRC32.Calc(Datastring).asHexString;
|
Re: CRC32 für einzelne Wörter!
versuch es mal so :gruebel:
Delphi-Quellcode:
Function TForm1.MyCRC32(Datastring: String): String;
var CRC32: ThxCRC32; begin CRC32.InitT; CRC32.Calc(Datastring); Result := CRC32.asHexString; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:13 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