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

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

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

Ответить
Владимир
постоялец
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

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

Сообщение Владимир »

Всем доброго!
Задача отправить в 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 байт, но что в них - не понятно.
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

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

Сообщение zub »

Код: Выделить всё

type TArrReal = packed array[0..7] of byte;
Владимир
постоялец
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

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

Сообщение Владимир »

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
Так и должно быть?
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

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

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

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

Сообщение Владимир »

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
Так и должно быть?
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

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

Сообщение iskander »

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

IEEE 754
Владимир
постоялец
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

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

Сообщение Владимир »

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

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

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