как преобразовать числа с порядком байтов в нативные числа Delphi - PullRequest
6 голосов
/ 18 июня 2010

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

Ответы [ 2 ]

18 голосов
/ 18 июня 2010

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

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

function SwapEndian16(Value: smallint): smallint; register;
asm
  rol   ax, 8
end;
3 голосов
/ 18 июня 2010

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

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;

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

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

...