2010-06-17 11 views
5

Ich möchte wissen, wie Big-Endian-Zahlen zu nativem Zahlen in Delphi zu konvertieren. Ich bin einige C++ Code, dass die Portierung stieß ich auf:wie Big-Endian-Zahlen zu nativem Zahlen umwandeln delphi

unsigned long blockLength = *blockLengthPtr++ << 24; 
blockLength |= *blockLengthPtr++ << 16; 
blockLength |= *blockLengthPtr++ << 8; 
blockLength |= *blockLengthPtr; 

unsigned long dataLength = *dataLengthPtr++ << 24; 
dataLength |= *dataLengthPtr++ << 16; 
dataLength |= *dataLengthPtr++ << 8; 
dataLength |= *dataLengthPtr; 

Ich bin nicht vertraut mit C++, so dass ich nicht verstehen, was die Betreiber tun.

+0

möglich Duplikat [How Big Endian konvertieren und wie die Flip höchste Bit?] (http://stackoverflow.com/questions/2882434/how-to-convert-big-endian-and-how-to-flip-the-highest-bit) –

Antwort

16

Andreas Antwort ist ein ziemlich gutes Beispiel dafür, wie es in der reinen pascal zu tun, aber es sieht immer noch ein bisschen umständlich, genau wie der C++ Code. Dies kann tatsächlich in einer einzigen Montageanleitung durchgeführt werden, obwohl die man hängt davon ab, ob Sie mit 32-Bit oder 16-Bit-Integer:

function SwapEndian32(Value: integer): integer; register; 
asm 
    bswap eax 
end; 

function SwapEndian16(Value: smallint): smallint; register; 
asm 
    xchg al, ah 
end; 
+0

Sie müssen das nicht angeben Aufruf Konvention, zumindest nicht für Delphi (weiß nicht über Free Pascal). "register" ist der Standardwert. –

+2

Das ist * die * Lösung, dann! –

+4

Sie nicht * müssen *, um die Aufrufkonvention, @ Michael angeben, aber es ist nützlich es in Assembler-Funktionen wie diese sind, da sie eine bestimmte Aufrufkonvention, um richtig zu funktionieren * * erfordern. –

2

die Reihenfolge der Bits zu umkehren:

procedure SwapEndiannessOfBits(var Value: cardinal); 
var 
    tmp: cardinal; 
    i: Integer; 
begin 
    tmp := 0; 
    for i := 0 to 8*sizeof(Value) - 1 do 
    inc(tmp, ((Value shr i) and $1) shl (8*sizeof(Value) - i - 1)); 
    Value := tmp; 
end; 

die Reihenfolge der Bytes umgekehrt:

procedure SwapEndiannessOfBytes(var Value: cardinal); 
var 
    tmp: cardinal; 
    i: Integer; 
begin 
    tmp := 0; 
    for i := 0 to sizeof(Value) - 1 do 
    inc(tmp, ((Value shr (8*i)) and $FF) shl (8*(sizeof(Value) - i - 1))); 
    Value := tmp; 
end; 

ich glaube, das letzte ist, was Sie suchen. Höchstwahrscheinlich gibt es schnellere und elegantere Lösungen.

Haftungsausschluss: Ich könnte völlig falsch sein. Ich bin im Moment etwas verwirrt. Hoffentlich wird jemand anderes diese Frage sehen und eine eindeutigere Antwort geben!