Страница 1 из 1

Разбить Double на байты

СообщениеДобавлено: 30.11.2020 09:56:39
Владимир
Всем доброго!
Задача отправить в COM порт байтовый массив данных, в котором, помимо прочего, отведено 8 байт на числовую информацию (чего-то там измеряют, тип Double).
Нашел для Single (4 байта) вот это
Код: Выделить всё
type TArrReal = array[0..9] of byte;


//===============================================

{Функция производит разбиение вещественного числа inReal на байты, которые размещает в массиве bytes, и возвращает количество байт, которое занимает переменная inReal}

function RealToByte(inReal : single;var bytes:TArrReal ):integer;

var i : integer;

begin

  i:=sizeof(inReal);

  move(inReal,bytes,i);

  result:=i;

end;

В функции поменял single на double, получаю 8 байт, но что в них - не понятно.

Re: Разбить Double на байты

СообщениеДобавлено: 30.11.2020 10:08:02
zub
Код: Выделить всё
type TArrReal = packed array[0..7] of byte;

Re: Разбить Double на байты

СообщениеДобавлено: 30.11.2020 10:25:03
Владимир
zub писал(а):
Код: Выделить всё
type TArrReal = packed array[0..7] of byte;

Спасиб, ничего не поменялось. С битовой арифметикой у меня плоховато.
Ввожу 1 получаю в 7-м байте 240, в 8-м - 63 (десятичные)
Ввожу 2 получаю в 7-м байте 0, в 8-м - 64
Ввожу 3 получаю в 7-м байте 8, в 8-м - 64
Ввожу 4 получаю в 7-м байте 16, в 8-м - 64
Так и должно быть?

Re: Разбить Double на байты

СообщениеДобавлено: 30.11.2020 10:34:55
iskander
Можно обойтись без Move():
Код: Выделить всё
type
  TBytes8 = array[0..7] of Byte;

function Double2Bytes(d: Double): TBytes8;
var
  r: TBytes8 absolute d;
begin
  Result := r;
end;

function Bytes2Double(a: TBytes8): Double;
var
  r: Double absolute a;
begin
  Result := r;
end;

а можно и вообще без функции:
Код: Выделить всё
type
  TBytes8 = array[0..7] of byte;
  PBytes8 = ^TBytes8;

var
  d: Double;
  a: TBytes8;

  d := 1.11E10;
  a := PBytes8(@d)^;

Re: Разбить Double на байты

СообщениеДобавлено: 30.11.2020 11:11:55
Владимир
iskander писал(а):type
TBytes8 = array[0..7] of Byte;

function Double2Bytes(d: Double): TBytes8;
var
r: TBytes8 absolute d;
begin
Result := r;
end;


Работает. Но. С битовой арифметикой у меня плоховато.
Ввожу 1 получаю в 7-м байте 240, в 8-м - 63 (десятичные)
Ввожу 2 получаю в 7-м байте 0, в 8-м - 64
Ввожу 3 получаю в 7-м байте 8, в 8-м - 64
Ввожу 4 получаю в 7-м байте 16, в 8-м - 64
Так и должно быть?

Re: Разбить Double на байты

СообщениеДобавлено: 30.11.2020 11:16:07
iskander
Владимир писал(а):Так и должно быть?

IEEE 754

Re: Разбить Double на байты

СообщениеДобавлено: 30.11.2020 11:33:47
Владимир
В документации указан формат как ASCII Hex IEEE float, спасибо, надеюсь, разберусь

Добавлено спустя 2 часа 32 минуты 4 секунды:
РЕШЕНО
Всем спасибо.

Добавлено спустя 1 минуту 29 секунд:
РЕШЕНО
Спасибо