У меня есть целое число длиной 8, например, 12345678. Мне нужно превратить его в массив байтов, например xx yy zz gg
как я могу преобразовать это в паскаль?
У меня есть целое число длиной 8, например, 12345678. Мне нужно превратить его в массив байтов, например xx yy zz gg
как я могу преобразовать это в паскаль?
В современном Паскале вы можете просто привести значение, используя круглые скобки.
Например, в фрипаскале:
{$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. страница о кроссплатформенном коде.)