@Neutral General:Tja, du hast recht. Es geht um Folgendes:
Delphi-Quellcode:
procedure Test;
var ArrNum:array of Byte;
begin
ArrNum := [00,00,00,08];
i := PInteger(@ArrNum[0])^;
end;
Da kommt 134217728 heraus. Ich muss aber auf den Wert 8 kommen.
Ich habe eine Routine zum Umdrehen der Bytes eingesetzt, die ich aus einer umständlichen Vorlage kondensiert habe:
Delphi-Quellcode:
function SwapArray(Arr:TBytes):TBytes;
var i,n:integer;
begin
SetLength(Result,Length(Arr));
n := Length(Arr) - 1;
For i := 0 to n do
Result[n - i] := Arr[i];
end;
Außerdem hatte ich folgenden Schnipsel:
Delphi-Quellcode:
function BigEndian2LittleEndian(aInt: integer): integer;
asm
xchg ah, al;
rol eax, 16;
xchg ah, al;
end;
Warum das heute funktioniert und gestern Nacht nicht, ist vermutlich deinem Einfluss und dem der Sterne zu verdanken. Daneben hatte ich noch
Result:= Wert xor $80000000;
, das offenbar mit Integern nicht funktioniert.
Die
ASM-Funktion wird vermutlich nicht mit Int64 funktionieren? (Bei meiner langen, unnötigen Suche kam ich auf das Stichwort "rax").
@Himitsu: Ja, mit genau solchen Dingen, die ich (noch) nicht so richtig kapiert habe, habe ich mich Stunden herumgeschlagen und offenbar den einfachen Weg übersehen. Möchte hinzufügen, dass ich die Byte-Repräsentation von SmallInt etc. natürlich verstehe; aber wie z.B. die das machen, dass ein Integer genauso viele Werte aufnehmen kann wie ein Cardinal trotz des Vorzeichenbytes, das verstehe ich nicht so richtig und muss es auch nicht. Und dann habe ich noch von Feinheiten bis runter zur CPU gelesen - nee, das sollen die Profis unter sich ausmachen.