![]() |
Re: CRC32 für einzelne Wörter!
Jetzt funktioniert es :) Aber warum das nicht auf einem Wisch geht ist mir schleierhaft. Da wäre ich niemals nicht draufgekommen.
|
Re: CRC32 für einzelne Wörter!
nja, mit neuen Funktionalitäten haben die Compiler anfangs öfters mal kleine Problemchen :stupid:
nach'm Überfliegen der Beschreibung, des oben verlinkten "Advanced Records"-Artikels, hätt ich erstmal vermutet es gibt Probleme, wenn man in soeiner Record-Prozeduren auf wiederum soeine Prozedur zugreift. :? |
Re: CRC32 für einzelne Wörter!
Zum Glück ist es nicht so :) In jedem Fall recht vielen Dank für alles und vor allem für deine Geduld!
|
Re: CRC32 für einzelne Wörter!
Hab da noch eine kurze Frage zu deinem CRC32 selbst. Bei Ethernet ist das ja so
Auszug aus Wikipedia: Zitat:
|
Re: CRC32 für einzelne Wörter!
Solche änderungen mußt du natürlich selber machen (der Code weiß ja nicht was du da berechnen willst und berechnet daher nur das "einfach" CRC32)
PS: ist die "Frame Check Sequence" nicht CRC16? hmmmmmmm? :gruebel: hier klingt es nach CRC16: ![]() aber hier nach CRC32: ![]() nach dem Aufbau in ![]()
Delphi-Quellcode:
(also falls du nicht den ganten FrameBuffer kopieren und darin direct die entsprechenden Stellen invertieren willst)
Var CRC: ThxCRC32;
Temp, FCS: LongWord; CRC.InitT(CRC32Table04); CRC.Init; CRC.Update(@SOF, 1); Temp := not PLongWord(@DestMAC)^; CRC.Update(@Temp, 4); CRC.Update(@DestMAC + 4, 2); Temp := not PLongWord(@SrcMAC)^; CRC.Update(@SrcMAC, 4); CRC.Update(@SrcMAC + 4, 2); CRC.Update(@TypeOrLength, 2) CRC.Update(@Data, DataLength); CRC.Final; FCS := not CRC{.asBin}; |
Re: CRC32 für einzelne Wörter!
Also laut
![]() Zitat:
Aber zu deinem Code: Werden da die jetzt schon die ersten 4 Bytes der MAC-Adresse und das Ergebniss invertiert? Kann deinem Code leider nur minimal folgen, was wohl an meinen rudimentären Pointerkenntnissen liegt :oops: |
Re: CRC32 für einzelne Wörter!
Wie gesagt, ob die Berechnung jetzt so ganz richtg ist, weiß ich nicht ...
- ich glaub irgendwo gelesen zu haben, daß irgendwas am Anfang (evtl, SOF?) nicht mit eingerechnet wird - und dann kommt es ja auch noch auf den Aufbau (deiner Variablen) an ... bin im Beispiel jetzt einfach mal von einzelnen Variablen für die einzelnen Teile der Struktur ausgegangen (und hoff deren Größe richtig gewählt zu haben) - jupp, die ersten 4 Byte der MACs werden schon invertiert, aber das könnte man auch noch entsprechend deinen Typen-/Variablendefinitionen verbessern/optimieren - beim .InitT mußt du aufpassen ... ohne die Richtige Hash-Tabelle wird das Ergebnis falsch sein CRC32Table04 ist eine vorberechnete Tabelle aus dem Polynom $04C11DB7, welches zwar vorwiegend bei AUTODIN II, Ethernet und &FDDI verwendet wird, aber ob das nun in diesem Fall stimmt :?:
Delphi-Quellcode:
wie gesagt, man könnte auch eine Kopie deines Frames(der ganzen Struktur) machen, darin die 2*4 Byte invertieren und dann über alles zusammen den Hash anlegen ... das geht aber nur/besser, wenn alles schon schön in einer Struktur (z.B. als Record) vorliegt
Temp := not PLongWord(@DestMAC)^; // 1. 4 Byte in LongInt(=4 Byte) konvertieren und invertieren(not)
CRC.Update(@Temp, 4); // diese 4 invertierten Byte ins CRC einberechnen CRC.Update(@DestMAC + 4, 2); // die letzen 2 Byte einberechnen FCS := not CRC.asBin; // hier wird das Ergebnis invertiert |
Re: CRC32 für einzelne Wörter!
Also ich hab mich jetzt nochmal drangesetzt und deinen Vorschlag versucht zu übernehmen. Doch leider kommt bei mir die Meldung
Zitat:
Delphi-Quellcode:
CRC.Update(@DestMAC + 4, 2);
Delphi-Quellcode:
Das SOF wird in die CRC-Berechnugn nicht einbezogen deshalb hab ich es entfernt.
//globale Variablen:
var DestMac,SrcMAC,TypeOrLength,Data: String; // CRC-Prüfsumme berechnen Function TForm1.MyCRC32: String; Var CRC: ThxCRC32; Temp, FCS: LongWord; begin CRC.InitT(CRC32Table04); CRC.Init; Temp := not PLongWord(@DestMAC)^; // 4 Byte in LongInt(=4 Byte) konvertieren und invertieren(not) CRC.Update(@Temp, 4); // diese 4 invertierten Byte ins CRC einberechnen CRC.Update(@DestMAC + 4, 2); // die letzen 2 Byte einberechnen HIER TAUCHT DER FEHLER AUF Temp := not PLongWord(@SrcMAC)^; CRC.Update(@SrcMAC, 4); CRC.Update(@SrcMAC + 4, 2); CRC.Update(@TypeOrLength, 2); CRC.Update(@Data, 46); CRC.Final; FCS := not CRC{.asBin}; // Result := CRC im Hexstring? Result := FCS.asHexstring; end; |
Re: CRC32 für einzelne Wörter!
ja, nicht mit alle Pointern kann man direkt rechnen
z.B.
Delphi-Quellcode:
außerdem zeigt @DestMAC (wenn es ein String ist) nicht auf die Daten (die Zeichen im String), sondern den DatenZeiger (sieht man aber nur, wenn man den internen Aufbau eines Strings kennt)
PAnsiChar(@DestMAC) + 4
// oder Pointer(Integer(@DestMAC) + 4) // und bei Strings @DestMAC[1] + 1 PS: DestMac, SrcMAC und TypeOrLength sind hier bestimmt als Binärwerte einzurechnen (es ist wohl sehr unwahrscheinlich, daß die Ethernet-Contoler intern mit Strings arbeiten)
Delphi-Quellcode:
Var DestMAC: Array[0..5] of Byte;
SrcMAC: Array[0..5] of Byte; //VLANTag: LongWord; TypeOrLength: Word; Data: Array[0..1499] of Byte; CRC: ThxCRC32; RecCRC, Temp: LongWord; Begin CRC.InitT(CRC32Table04); CRC.Init; Temp := not PLongWord(@DestMAC[0])^; CRC.Update(@Temp, 4); CRC.Update(@DestMAC[4], 2); Temp := not PLongWord(@SrcMAC[0])^; CRC.Update(@Temp, 4); CRC.Update(@SrcMAC[4], 2); //CRC.Update(@VLANTag, 4); CRC.Update(@TypeOrLength, 2); CRC.Update(@Data[0], DataLen); CRC.Final; RecCRC := not CRC.asBin; End;
Delphi-Quellcode:
Var Rec, TempRec: packed Record
DestMAC: Array[0..5] of Byte; SrcMAC: Array[0..5] of Byte; //VLANTag: LongWord; TypeOrLength: Word; Data: Array[0..1499] of Byte; End; CRC: ThxCRC32; RecCRC: LongWord; Begin TempRec := Rec; // irgendwie kopieren CRC.InitT(CRC32Table04); CRC.Init; For i := 0 to 3 do Begin TempRec.DestMAC[i] := not TempRec.DestMAC[i]; TempRec.SrcMAC[i] := not TempRec.SrcMAC[i]; End; CRC.Update(@TempRec, 6+6{+4}+2+DataLen); CRC.Final; RecCRC := not CRC.asBin; End; |
Re: CRC32 für einzelne Wörter!
Also ich würde das ja gerne so mit dem record machen allerdings weiß ich nicht genau wie ich meine MAC-Adressen in Hex umwandel und in das Array of Byte speichern soll. Weil das muss ich ja machen, oder?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:01 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