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;