Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

Re: CRC32 für einzelne Wörter!

  Alt 27. Jan 2009, 12: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;
$2B or not $2B
  Mit Zitat antworten Zitat