Вот вам простой пример, 4 значения в памяти -- одно двойное слово, три числа с плавающей точкой двойной точности, и их текстовое (произвольное) и двоичное представление:
- Код: Выделить всё
type
PSomeRec = ^TSomeRec;
TSomeRec = record
id: longword;
x, y, z: double;
end;
procedure DumpSomeRec(const R: TSomeRec);
begin
with R do WriteLn('SR{ID=', id, ';', x, ',', y, ',', z, '}');
end;
procedure DumpHex(var V; Size: word);
const
HD: array [0..$F] of char = '0123456789ABCDEF';
var
M: array [0..65535] of byte absolute V;
i: word;
begin
for i := 0 to Size-1 do begin
Write(' ', HD[M[i] shr 4], HD[M[i] and $F]);
if (i+1) and $F = 0 then WriteLn;
end;
end;
var
r: TSomeRec;
begin
with r do begin
id := $12345678;
x := 2.5; y := 3.8; z := -7.4;
end;
DumpSomeRec(r);
DumpHex(r, sizeof(r));
end.
Прогон:
- Код: Выделить всё
SR{ID=305419896; 2.50000000000000E+000, 3.80000000000000E+000,-7.40000000000000E+000}
78 56 34 12 00 00 00 00 00 00 00 00 00 00 04 40
66 66 66 66 66 66 0E 40 9A 99 99 99 99 99 1D C0
Вы при чтении получаете двоичное представление. Чтобы получить адекватное текстовое, достаточно знать размеры данных и правила их интерпретации (да, это называется типы), а для многобайтных значений -- ещё и порядок байт (от старшего к младшему или от младшего к старшему), грубо говоря прочитать в переменную соответствующего типа или преобразовать адрес в памяти к указателю на соответствующий тип и разыменовать его, например: with PSomeRec(Data)^ do WriteLn(id, x, y, z);
Расшифровка полей:
- Код: Выделить всё
78 56 34 12 00 00 00 00 00 00 00 00 00 00 04 40
^---(1)---^ ^---(2)---^ ^---------(3)---------^
66 66 66 66 66 66 0E 40 9A 99 99 99 99 99 1D C0
^---------(4)---------^ ^---------(5)---------^
1 - число 305419896 в 10-чной системе счисления, оно же 12345678 в 16-ричной,
2 - "дырка" -- выравнивание на границу 8 байт,
3 - x: 2.5 с двойной точностью (8 байт),
4 - y: 3.8 с двойной точностью,
5 - z: -7.4 с двойной точностью.
Если бы запись была объявлена как "packed record", её представление в памяти было бы таким:
- Код: Выделить всё
78 56 34 12 00 00 00 00 00 00 04 40 66 66 66 66
^---(1)---^ ^---------(3)---------^ ^-----(4...
66 66 0E 40 9A 99 99 99 99 99 1D C0
...4)-----^ ^---------(5)---------^