|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Перевод пакетных данных в float число
Приходит некий пакет данных в нем есть данные 4 байта - "42 59 11 c7"
данные в "формате Motorola (MSB->LSB), то есть для преобразования этих чисел в формат Intel, применяемый в PC-совместимых компьютерах, необходимо поменять порядок байт на обратный" помогите как сделать преобразование этих данных в число float. |
#2
|
|||
|
|||
А чем тебя 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
|
|||
|
|||
сам спросил, сам разобрался - чтобы потом кто-то наткнувшись не пошел искать дальше примеду пример решения.
Преобразование двоичного числа с плавающей точкой в 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..... (небуду записывать все знаки) вот как-то так все и получается. как это реализавать в коде уже дело отдельное - но думаю это будет несложно |