Паскаль. Преобразование in в массив байтов

У меня есть целое число длиной 8, например, 12345678. Мне нужно превратить его в массив байтов, например xx yy zz gg

как я могу преобразовать это в паскаль?


person Ryan Darras    schedule 07.08.2013    source источник
comment
аналогичный вопрос /13634240/   -  person Sam    schedule 07.08.2013


Ответы (1)


В современном Паскале вы можете просто привести значение, используя круглые скобки.

Например, в фрипаскале:

{$mode fpc}
program bytecast;
uses sysutils;
  type bytes = array[0..3] of byte;
  var x : uint32 = $12345678; i : byte; b : bytes;
begin
  b := bytes(x);
  for i := 0 to 3 do Writeln('$',IntToHex(b[i],1))
end.

выход:

$78
$56
$34
$12

Обратите внимание, что «обратный» порядок здесь происходит из-за того, что я работаю на архитектуре x86, которая использует порядок байтов с прямым порядком байтов.

Если вас беспокоит межплатформенная переносимость, вы можете извлечь байты вручную:

{ var r : uint32; ... }
for i := 0 to 3 do                                                          
  begin
    DivMod(x, $100, x, r); { needs 'uses math'. note: this destroys x! }
    b[3-i] := r
  end;

Теперь байты будут расположены в более интуитивно понятном порядке, и результат более раннего цикла WriteLn станет таким:

$12
$34
$56
$78

Это будет работать на всех платформах, а также на любом диалекте Pascal, который предотвращает простое приведение типов за счет выполнения немного большей работы. (Для другого варианта см. процедуру SwapEndian и эту вики FPC. страница о кроссплатформенном коде.)

person tangentstorm    schedule 08.08.2013