AGB  ·  Datenschutz  ·  Impressum  







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

CRC32 für einzelne Wörter!

Ein Thema von fes · begonnen am 6. Jul 2005 · letzter Beitrag vom 28. Jan 2009
Antwort Antwort
Seite 3 von 4     123 4      
SaltJohn

Registriert seit: 9. Jun 2008
43 Beiträge
 
#21

Re: CRC32 für einzelne Wörter!

  Alt 22. Jan 2009, 15:13
Jetzt funktioniert es Aber warum das nicht auf einem Wisch geht ist mir schleierhaft. Da wäre ich niemals nicht draufgekommen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: CRC32 für einzelne Wörter!

  Alt 22. Jan 2009, 15:25
nja, mit neuen Funktionalitäten haben die Compiler anfangs öfters mal kleine Problemchen

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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
SaltJohn

Registriert seit: 9. Jun 2008
43 Beiträge
 
#23

Re: CRC32 für einzelne Wörter!

  Alt 22. Jan 2009, 15:39
Zum Glück ist es nicht so In jedem Fall recht vielen Dank für alles und vor allem für deine Geduld!
  Mit Zitat antworten Zitat
SaltJohn

Registriert seit: 9. Jun 2008
43 Beiträge
 
#24

Re: CRC32 für einzelne Wörter!

  Alt 23. Jan 2009, 06:07
Hab da noch eine kurze Frage zu deinem CRC32 selbst. Bei Ethernet ist das ja so
Auszug aus Wikipedia:
Zitat:
Zur Berechnung der CRC-32-Prüfsumme werden die ersten 32 Bits der Mac-Adresse invertiert und das Ergebnis ebenfalls invertiert (Vermeidung des Nullproblems).
Das wird bei CRC32 nicht generell gemacht bzw. das muss ich noch implementieren, oder?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: CRC32 für einzelne Wörter!

  Alt 24. Jan 2009, 10:40
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?
hier klingt es nach CRC16: http://de.wikipedia.org/wiki/Frame_Check_Sequence (mit 16 Bit verwendet)
aber hier nach CRC32: http://de.wikipedia.org/wiki/Datenframe (4 Byte)


nach dem Aufbau in http://de.wikipedia.org/wiki/Datenframe würde ich die Brechnung wohl irgendwie in dieser Richtung vermuten:
Delphi-Quellcode:
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};
(also falls du nicht den ganten FrameBuffer kopieren und darin direct die entsprechenden Stellen invertieren willst)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
SaltJohn

Registriert seit: 9. Jun 2008
43 Beiträge
 
#26

Re: CRC32 für einzelne Wörter!

  Alt 25. Jan 2009, 09:11
Also laut http://de.wikipedia.org/wiki/Ethernet steht bei FCS geschrieben:

Zitat:
Das FCS-Feld stellt eine 32-Bit-CRC-Prüfsumme dar. Die FCS wird über den eigentlichen Frame berechnet, also beginnend mit der Ziel-MAC-Adresse und endend mit dem PAD-Feld. Die Präambel, der SFD und die FCS selbst sind nicht in der FCS enthalten. Wenn ein Paket beim Sender erstellt wird, wird eine CRC-Berechnung über die Bitfolge durchgeführt und die Prüfsumme an den Datenblock angehängt. Der Empfänger führt nach dem Empfang die gleiche Berechnung aus. Stimmt die empfangene nicht mit der selbst berechneten Prüfsumme überein, geht der Empfänger von einer fehlerhaften Übertragung aus, und der Datenblock wird verworfen.

Zur Berechnung der CRC-32-Prüfsumme werden die ersten 32 Bits der Mac-Adresse invertiert und das Ergebnis ebenfalls invertiert (Vermeidung des Nullproblems).

Die FCS wird, anders als die Datenbits, mit dem höchstwertigen Bit voran übertragen, womit der Empfänger seine CRC-Prüfung auch über das PAD-Feld hinaus auf die FCS anwenden kann. Ist die Prüfsumme nach Verwendung der FCS ungleich Null, war die Übertragung fehlerhaft.
Also sollte dann doch CRC32 sein, oder? Ich meine sehen werde ich es ja spätestend wenn die Frames bei einem Switchdurchlauf verworfen werden

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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: CRC32 für einzelne Wörter!

  Alt 25. Jan 2009, 09:30
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:
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
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
saltjohn2

Registriert seit: 27. Jan 2009
5 Beiträge
 
#28

Re: CRC32 für einzelne Wörter!

  Alt 27. Jan 2009, 10:48
Also ich hab mich jetzt nochmal drangesetzt und deinen Vorschlag versucht zu übernehmen. Doch leider kommt bei mir die Meldung
Zitat:
[Pascal Fehler] ConfigTelegramm.pas(190): E2015 Operator ist auf diesen Operandentyp nicht anwendbar
in der Zeile mit CRC.Update(@DestMAC + 4, 2);
Delphi-Quellcode:
//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;
Das SOF wird in die CRC-Berechnugn nicht einbezogen deshalb hab ich es entfernt.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: CRC32 für einzelne Wörter!

  Alt 27. Jan 2009, 11:08
ja, nicht mit alle Pointern kann man direkt rechnen

z.B.
Delphi-Quellcode:
PAnsiChar(@DestMAC) + 4
// oder
Pointer(Integer(@DestMAC) + 4)
// und bei Strings
@DestMAC[1] + 1
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)


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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
saltjohn2

Registriert seit: 27. Jan 2009
5 Beiträge
 
#30

Re: CRC32 für einzelne Wörter!

  Alt 27. Jan 2009, 12:57
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?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


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 02:44 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