Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.07.2009, 10:43
Serval Serval вне форума
Прохожий
 
Регистрация: 20.01.2009
Сообщения: 18
Репутация: 30
Вопрос Перевод пакетных данных в float число

Приходит некий пакет данных в нем есть данные 4 байта - "42 59 11 c7"

данные в "формате Motorola (MSB->LSB), то есть для преобразования этих чисел в формат Intel, применяемый в PC-совместимых компьютерах, необходимо поменять порядок байт на обратный"

помогите как сделать преобразование этих данных в число float.
Ответить с цитированием
  #2  
Старый 28.07.2009, 12:38
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,018
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А чем тебя DWORD не устраивает - как раз 4 байта.
Менять порядок - с помощью масок и сдвига.

Если я правильно помню, то надо их менять парами:
Код:
const
  HiMask = $FFFF0000;
  LoMask = $0000FFFF;
var
  InWord : DWORD;
  OutWord : DWORD;
  HiWord : DWORD;
  LoWord : DWORD;
begin
  InWord := $1111AAAA; // Исх. данные
  HiWord := InWord Or HiMask;
  LoWord := InWord Or LoMask;
  HiWord := HiWord Shr 16;
  LoWord := LoWord Shl 16;
  OutWord := HiWord Or LoWord; // Получаем результат

ЗЫ. Код написал максимально развернуто, что бы был понятен алгоритм. Естественно, его можно оптимизировать как по памяти, так и по кол-ву операций. Здесь обмен местами слов, если надо поменять местами еще и байты, то делается это аналогично.
Ответить с цитированием
  #3  
Старый 28.07.2009, 12:52
Serval Serval вне форума
Прохожий
 
Регистрация: 20.01.2009
Сообщения: 18
Репутация: 30
Смущение

сам спросил, сам разобрался - чтобы потом кто-то наткнувшись не пошел искать дальше примеду пример решения.

Преобразование двоичного числа с плавающей точкой в 32 битный формат IEEE754

формула F= (-1)^s*2^(E-127)*(1+M/2^23)

где:
S- бит знака (31 бит)
E- смещенная экспонента (23-30 биты)
M - остаток от мантиссы (0-22 биты)
F- десятичное число с плавающей точкой


Формат числа таков:
старший бит = знак,
8 бит = порядок + 127 (127=смещение),
младшие = мантисса.


берем 42 59 11 c7 и преобразуем в бинарный вид получаем 1000010010110010001000111000111

разбираем полученное

0 10000100 10110010001000111000111 (1бит 8бит 23бита - первый бит=0 поэтому например в калькуляторе его непокажут - отсчитывайте с конца)

0=S - знак "+" (1 это "-")
10000100=132=Е - смещенная экспонента
1011001000100011100011 - мантисса ( Но, у нормализованной двоичной мантиссы первый бит всегда равен 1, так как число лежит в диапазоне 1<=M<2. Нет смыла, записывать единицу в отведенные 23 бита, поэтому в отведенные 23 бита записывается остаток от мантиссы.)
дописываем "1", получаем 11011001000100011100011=7112931=M



F= (-1)^s*2^(E-127)*(1+M/2^23)=(-1)^0*2^(132-127)*(1+7112931/2^23)
=1*2^5*(1+7112931/8388608)=1*32*(1,84...)=59,13..... (небуду записывать все знаки)

вот как-то так все и получается.


как это реализавать в коде уже дело отдельное - но думаю это будет несложно
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:57.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter