Вторник, 30.04.2024
Андрей Захаров
Меню сайта
Категории раздела
Delphi, Lazarus, Pascal ... [3]
Спорт [1]
Нравственность [4]
Другое [0]
Техника [4]
Наш опрос
Оцените мой сайт
Всего ответов: 79

Статистика

Рейтинг@Mail.ru

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа
Радио
Главная » Статьи » Delphi, Lazarus, Pascal ...

Разбить вещественное число на байты

          Недавно передо мной встала задача - передать вещественное число типа Single, размером в 4 байта, по последовательному порту. Естественно, перед тем, как передавать это число, а передача должна осуществляться побайтно, необходимо разбить вещественное число на байты. Покопался в Интернете, но ничего толкового не нашел, удивился - по моему мнению, с такой задачей кто-нибудь уже должен был столкнуться. Поэтому пришлось самому попытаться найти решение. Через некоторое время такое решение появилось.

          Для преобразования я применил процедуру Move, позволяющую передать переменную в поле другой переменной, причем, что важно, вне зависимости от типа. При использовании данной процедуры, конечно, надо соблюдать осторожность, чтобы не выйти за пределы области памяти, отведенной под переменную - приемник. Для контроля за количеством передаваемых байт используется функция SizeOf(). Поскольку длина вещественного типа в Delphi не превышает 10 байт, индекс байтового массива ограничен 9.

 

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;

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

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

function ByteToReal(bytes:TArrReal):single;

var i : integer;

begin

 i:=sizeof(Result);

 move(Bytes,Result,i);

end;

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

 

{Эта процедура позволяет проверить корректность преобразования}

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

procedure TForm1.Button1Click(Sender: TObject);

var b:TArrReal;

    i,j:integer;

    s:string;

    r:single;

begin

  i:=RealToByte(-371955,b);

  r:=ByteToReal(b);

  str(r:10:7,s);

  s:=s+' ';

  for j :=0 to i-1 do s:=s+inttohex(b[j],2)+' ';

  Form1.Label1.Caption:=s;

end;

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

 

 

 

Категория: Delphi, Lazarus, Pascal ... | Добавил: Andrew1955 (15.08.2012)
Просмотров: 3946 | Теги: Андрей Захаров, Разбить вещественное число на байты, последовательный порт, передача вещественного числа | Рейтинг: 5.0/1
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск


Погода
Ставрополь
Архипо-Осиповка
Домбай
Екатеринбург
               
      
          


Визиты
Сайт существует
Калькулятор
Copyright Andrew © 2024
Яндекс.Метрика