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

Я имею целое число с длиной 8, пример может быть 12345678. Мне нужно превратить это в массив байтов, таких как xx yy zz gg

как мне перейти на преобразование этого в pascal?

1 ответ

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

Например, в свободном паскале:

{$mode fpc}
program bytecast;
uses sysutils;
 type bytes = array[0..3] of byte;
 var x : ****** = $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 : ******; ... }
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

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

licensed under cc by-sa 3.0 with attribution.