Я хочу знать, как преобразовать числа с обратным порядком байтов в собственные числа в Delphi. Я портирую некоторый код C++, в котором я столкнулся:
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;
Я не знаком с C++, таким образом, я не понимаю то, что делают те операторы.
Ответ Андреаса - довольно хороший пример того, как это сделать на чистом паскале, но он по-прежнему выглядит неуклюже, как и код C ++. На самом деле это можно сделать с помощью одной инструкции сборки, хотя какая из них зависит от того, используете ли вы 32-битные или 16-битные целые числа:
function SwapEndian32(Value: integer): integer; register;
asm
bswap eax
end;
function SwapEndian16(Value: smallint): smallint; register;
asm
rol ax, 8
end;
Чтобы изменить порядок битов:
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;
Чтобы изменить порядок байтов:
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;
Я думаю, последний это то, что вы ищете. Но, скорее всего, есть более быстрые и элегантные решения.
Отказ от ответственности: я могу полностью ошибаться. Сейчас я немного сбит с толку. Надеюсь, кто-то еще увидит этот вопрос и даст более определенный ответ!