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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Преобразование последовательности байтов во float 
V
    Опции темы
Hukuma
Дата 17.4.2009, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 18.2.2009

Репутация: нет
Всего: нет



Здравствуйте!

Тема похожа на эту http://forum.vingrad.ru/topic-64014.html

Исходные данные - есть последовательность из 4ых байтов - это части числа в формате float. Т.е. знак экспоненты,экспонент, мантисса.
нужно из этих 4ых байтов собрать число в формате float.. я понял, что это можно сделать, использую побитовые операции, это как описано
в теме, на которую я сослался.. а вопрос такой - а нельзя это сделать проще? Очень туго въезжаю в формат IEEE754. Или нет других путей? 
PM MAIL   Вверх
UniBomb
Дата 17.4.2009, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 2
Всего: 97



Код

float  GetFloatFromFourBytes(char [] data)
 {
  union 
   {
     float num;
     char byte[4];
   } SimpleFloat;

  for(int i = 0; i < 4; i++)
   SimpleFloat.byte[i] = data[i];

  return SimpleFloat.num;
 }


как то так....

Это сообщение отредактировал(а) UniBomb - 17.4.2009, 15:05
PM MAIL ICQ Skype   Вверх
Hukuma
Дата 17.4.2009, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 18.2.2009

Репутация: нет
Всего: нет



Unibomb,спасибо большое..интересный вариант, понравилс очень, сейчас попробую smile
PM MAIL   Вверх
InvalidProperty
Дата 17.4.2009, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 356
Регистрация: 31.10.2007
Где: Россия, Казань

Репутация: нет
Всего: 9



только, наверное, порядок байт в слове еще нужно учитывать


--------------------
dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null
dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null
echo $0 >> $0
PM MAIL ICQ Jabber   Вверх
GoldFinch
Дата 17.4.2009, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



Цитата(UniBomb @  17.4.2009,  16:04 Найти цитируемый пост)
float  GetFloatFromFourBytes(char [] data)
 {
  union 
   {
     float num;
     char byte[4];
   } SimpleFloat;
  for(int i = 0; i < 4; i++)
   SimpleFloat.byte[i] = data[i];
  return SimpleFloat.num;
 }

Жесть какая, 4 байта копировать в 4 байта циклом %)

return (float)data[0];

Это сообщение отредактировал(а) GoldFinch - 17.4.2009, 15:29
PM MAIL ICQ   Вверх
UniBomb
Дата 17.4.2009, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 2
Всего: 97



Цитата(GoldFinch @  17.4.2009,  15:16 Найти цитируемый пост)
return (float)data[0];

А теперь спроси у компилятора (у лбого), что он думает по поводу этой строчки. Компилятор ответит, что результатом будет содержимое этой переменной (data[0]), пробразованное во float. 

А копировать ничего не придётся, если массив data объявить в составе объединения.
PM MAIL ICQ Skype   Вверх
InvalidProperty
Дата 17.4.2009, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 356
Регистрация: 31.10.2007
Где: Россия, Казань

Репутация: нет
Всего: 9



Цитата(UniBomb @  17.4.2009,  16:22 Найти цитируемый пост)
А копировать ничего не придётся, если массив data объявить в составе объединения. 

это истина, ибо union это не какой-то там struct. Его поля одинаковой длины ссылаются на одно и то же значение


--------------------
dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null
dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null
echo $0 >> $0
PM MAIL ICQ Jabber   Вверх
GoldFinch
Дата 17.4.2009, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



UniBomb, ок, return *(float*)data;
PM MAIL ICQ   Вверх
Rififi
Дата 17.4.2009, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 11
Всего: 36



GoldFinch, 
Жесть какая, 4 байта копировать в 4 байта циклом %)

return (float)data[0];

лучше жесть, чем неработающая кривизна ЖлолЖ
PM MAIL   Вверх
zim22
Дата 18.4.2009, 07:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Код

float  GetFloatFromFourBytes(void *data)
 {
...
   SimpleFloat.num = *static_cast<float*>(data);



Это сообщение отредактировал(а) zim22 - 18.4.2009, 07:50


--------------------
PM MAIL   Вверх
GoldFinch
Дата 18.4.2009, 10:15 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



Rififi, объясни, зачем читать через пост, а не все посты подряд?
PM MAIL ICQ   Вверх
mrbrooks
Дата 20.4.2009, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 2
Всего: 306



zim22, может все таки лучше через reinterpret_cast имхо.

по сабжу конечно объединения хороши, но и memcpy тоже не плохо.
PM MAIL   Вверх
Rickert
Дата 20.4.2009, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



А memcpy никто не пробовал? smile 


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
zim22
Дата 20.4.2009, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(mrbrooks @  20.4.2009,  08:15 Найти цитируемый пост)
может все таки лучше через reinterpret_cast имхо.

я сначала сделал вариант с reinterpret_cast, но потом вспомнил, что это опасные преобразования.
а static_cast - безопаснее. тем более с ним работает тоже smile


--------------------
PM MAIL   Вверх
mrbrooks
Дата 20.4.2009, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 2
Всего: 306



Цитата(zim22 @  20.4.2009,  08:29 Найти цитируемый пост)
я сначала сделал вариант с reinterpret_cast, но потом вспомнил, что это опасные преобразования.

опасные - для классов, для базовых типов - думаю не очень  smile 

Цитата(zim22 @  20.4.2009,  08:29 Найти цитируемый пост)
а static_cast - безопаснее. тем более с ним работает тоже 

если так - то и славно - еще одно решение в копилку.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0652 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.