2010-06-17 15 views
5

Voglio sapere come convertire i numeri big-endian in numeri nativi in ​​Delphi. Sto porting del codice C++ a che mi sono imbattuto:come convertire i numeri big-endian in numeri nativi 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; 

non ho familiarità con C++, quindi non capisco che cosa questi operatori fanno.

+0

possibile duplicato di [Come convertire Big Endian e come capovolgere il il più alto?] (http://stackoverflow.com/questions/2882434/how-to-convert-big-endian-and-how-to-flip-the-highest-bit) –

risposta

16

La risposta di Andreas è un ottimo esempio di come farlo in puro pascal, ma sembra ancora un po 'scomodo, proprio come il codice C++. Questo può essere fatto in una singola istruzione di assemblaggio, anche se dipende dal fatto che si utilizzino numeri interi a 32 o 16 bit:

+0

Non è necessario specificare il chiamata convention, almeno non per Delphi (non so su Free Pascal). 'register' è il valore predefinito. –

+2

Questa è * la * soluzione, quindi! –

+4

Non è * necessario * specificare la convenzione di chiamata, @Michael, ma è utile includerlo nelle funzioni di assemblatore come questo poiché * richiedono * una convenzione di chiamata specifica per funzionare correttamente. –

2

per invertire l'ordine dei bit:

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; 

Per invertire l'ordine dei byte:

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; 

penso che l'ultimo è quello che stai cercando. Molto probabilmente ci sono soluzioni più veloci e più eleganti, però.

Disclaimer: Potrei essere totalmente sbagliato. Mi sento un po 'confuso al momento. Speriamo che qualcun altro vedrà questa domanda e fornirà una risposta più precisa!

Problemi correlati