как преобразовать числа с обратным порядком байтов в собственные числа Дельфи

Я хочу знать, как преобразовать числа с обратным порядком байтов в собственные числа в 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++, таким образом, я не понимаю то, что делают те операторы.

6
задан Rob Kennedy 17 June 2010 в 21:11
поделиться

2 ответа

Ответ Андреаса - довольно хороший пример того, как это сделать на чистом паскале, но он по-прежнему выглядит неуклюже, как и код C ++. На самом деле это можно сделать с помощью одной инструкции сборки, хотя какая из них зависит от того, используете ли вы 32-битные или 16-битные целые числа:

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

function SwapEndian16(Value: smallint): smallint; register;
asm
  rol   ax, 8
end;
19
ответ дан 8 December 2019 в 05:20
поделиться

Чтобы изменить порядок битов:

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;

Я думаю, последний это то, что вы ищете. Но, скорее всего, есть более быстрые и элегантные решения.

Отказ от ответственности: я могу полностью ошибаться. Сейчас я немного сбит с толку. Надеюсь, кто-то еще увидит этот вопрос и даст более определенный ответ!

4
ответ дан 8 December 2019 в 05:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: