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

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Разбить 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 байт, но что в них - не понятно.
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

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

Сообщение zub » 30.11.2020 10:08:02

Код: Выделить всё
type TArrReal = packed array[0..7] of byte;
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

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
Так и должно быть?
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

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

Сообщение iskander » 30.11.2020 10:34:55

Можно обойтись без 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)^;
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

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
Так и должно быть?
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

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

Сообщение iskander » 30.11.2020 11:16:07

Владимир писал(а):Так и должно быть?

IEEE 754
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

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

Сообщение Владимир » 30.11.2020 11:33:47

В документации указан формат как ASCII Hex IEEE float, спасибо, надеюсь, разберусь

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

Добавлено спустя 1 минуту 29 секунд:
РЕШЕНО
Спасибо
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10

Рейтинг@Mail.ru