Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi CRC32 für einzelne Wörter! (https://www.delphipraxis.net/49177-crc32-fuer-einzelne-woerter.html)

negaH 6. Jul 2005 23:00

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:
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;
Gruß Hagen

fes 7. Jul 2005 17:43

Re: CRC32 für einzelne Wörter!
 
THX!!!

SaltJohn 21. Jan 2009 16:22

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?

himitsu 21. Jan 2009 16:51

Re: CRC32 für einzelne Wörter!
 
als Alternativen hätten wir noch

Hagen's Hier im Forum suchenDEC Bei Google suchenDEC (Delphi Encrytion Compendium)
http://www.michael-puff.de/Developer...agen_Reddmann/

HashLib! v1.03.exe
http://www.delphipraxis.net/internal...?p=96430#96430

vieles vieles mehr

und im Notfall noch was von mir
http://www.delphipraxis.net/internal...t.php?t=135239

Delphi-Quellcode:
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;
der CRC32-Teil ließe sich auch "einfach" aus dem Projekt extrahieren

SaltJohn 22. Jan 2009 08:37

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))

himitsu 22. Jan 2009 11:48

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:
Function MyCRC32(Datastring: String): String;
  Var CRC32: ThxCRC32;

  Begin
    CRC32.InitT;
    Result := CRC32.Calc(S).asHexString;
  End

aString := aString + MyCRC32(aString);
oder so
Delphi-Quellcode:
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);
aber am Effektivsten sähe es dann so aus:
(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.

SaltJohn 22. Jan 2009 13:38

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.

himitsu 22. Jan 2009 13:55

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}

"Advanced" Records - Internal Errors URW821 and C1624

SaltJohn 22. Jan 2009 14:46

Re: CRC32 für einzelne Wörter!
 
Also ich benutze Delphi2006. Nachdem ich bei beiden units
Delphi-Quellcode:
{$INLINE OFF}
eingefügt habe kommt jetzt die Meldung
Zitat:

[Pascal Fatal Error] Unit1.pas(209): F2084 Internal Error: C1624
Alles was ich gemacht habe ist deine Unit eingebunden

und in meiner Main den Aufruf mit

Delphi-Quellcode:
crcChecksum := MyCRC32(Datastring);
zu

Delphi-Quellcode:
// CRC-Prüfsumme berechnen
Function TForm1.MyCRC32(Datastring: String): String;
var CRC32: ThxCRC32;
begin
  CRC32.InitT;
  Result := CRC32.Calc(Datastring).asHexString;
end;
das Programm wird nur dann fertig compiliert wenn ich
Delphi-Quellcode:
Result := CRC32.Calc(Datastring).asHexString;
auskommmentiere

himitsu 22. Jan 2009 14:58

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.
Seite 2 von 4     12 34      

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