Im Mode ObjFPC können Pointer als Arrays benutzt werden (im Mode Delphi nur ein paar Pointer, aber PByte gehört dazu). Das PByte(@Result)[INDEX] sagt dem Compiler also einfach "tu so als wäre Result ein Byte array und greif auf das Element INDEX zu". Und das geht auf beiden Seiten eines Assignments. Hier wird also Result als Byte Array interpretiert um die Bytes einzeln zu schreiben, und ll wird als Byte array interpretiert um die einzelnen Bytes zu lesen.Mathias hat geschrieben: Do 12. Okt 2023, 17:17 Da habe ich jetzt nicht schlecht gestaunt, dies wird tatsächlich kompiliert.
Vor allem links vom := sieht echt merkwürdig aus.Ich hätte sowas mit mit and, or, not, shl, etc. gelöst.Code: Alles auswählen
function ntohll(ll:QWord):QWord; begin Result:=0; PByte(@Result)[0]:=PByte(@ll)[7]; PByte(@Result)[1]:=PByte(@ll)[6]; PByte(@Result)[2]:=PByte(@ll)[5]; PByte(@Result)[3]:=PByte(@ll)[4]; PByte(@Result)[4]:=PByte(@ll)[3]; PByte(@Result)[5]:=PByte(@ll)[2]; PByte(@Result)[6]:=PByte(@ll)[1]; PByte(@Result)[7]:=PByte(@ll)[0]; end;
Das sowas geht hätte ich nie gedacht.
Das geht übrigens im Mode ObjFPC mit allen Pointer typen:
Code: Alles auswählen
type
PWordRec = ^TWordRec;
TWordRec = record
loByte, hiByte: Byte;
end;
var
i: Integer = 2135204;
begin
WriteLn(PWordRec(@i)[0].loByte);
WriteLn(PWordRec(@i)[0].hiByte);
WriteLn(PWordRec(@i)[1].loByte);
WriteLn(PWordRec(@i)[1].hiByte);
end.
Code: Alles auswählen
type
TWordRec = record
loByte, hiByte: Byte;
end;
TWordRecArray = array[0..High(SizeInt) div sizeOf(TWordRec) - 1] of TWordRec;
PWordRecArray = ^TWordRecArray;
var
i: Integer = 2135204;
begin
WriteLn(PWordRecArray(@i)^[0].loByte);
WriteLn(PWordRecArray(@i)^[0].hiByte);
WriteLn(PWordRecArray(@i)^[1].loByte);
WriteLn(PWordRecArray(@i)^[1].hiByte);
end.