Russian Qt Forum
Май 06, 2024, 22:50 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Преобразовать "hex" в float  (Прочитано 7268 раз)
Nidxogg
Гость
« : Июль 11, 2015, 11:34 »

Добрый день
Имеется бинарный файл. Если открыть его HEX-просмотрщике (к примеру, в total commander), то можно увидеть значение 00 97 35 54
Как можно преобразовать это значение во float 97.3554?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Июль 11, 2015, 11:54 »

Добрый день
Имеется бинарный файл. Если открыть его HEX-просмотрщике (к примеру, в total commander), то можно увидеть значение 00 97 35 54
Как можно преобразовать это значение во float 97.3554?
Код
C++ (Qt)
float ReadIncorrect( QFile & file )
{
short temp[2];
file.readData((char *)  temp, 4);
return qFromBigEndian(temp[0]) + qFromBigEndian(temp[1]) / 10000.0f;
}
Будьте уверены что Вы хотели получить именно 97.3554, т.к. это не соответствует никакому стандартному представлению данных, чисто "самопальный" формат, ну вот кто-то захотел записать флот как 2 шорта
Записан
Nidxogg
Гость
« Ответ #2 : Июль 11, 2015, 13:21 »

Формат действительно самопальный, но заказчик хочет
Сам сделал через QString, ваш вариант получше

Благодарю.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #3 : Июль 11, 2015, 13:32 »

Сам сделал через QString, ваш вариант получше
Только он не работает.
0x97 (hex) != 97 (dec)

Записан
Nidxogg
Гость
« Ответ #4 : Июль 11, 2015, 13:46 »

Проверить ещё не успел

P.S. Сам сделал так
 
sec, msec - соответсвенно ushort из файла
Код:
        ushort time_sec = QString("%1").arg(qToBigEndian(sec),0,16).toUShort();
        ushort time_msec = QString("%1").arg(qToBigEndian(msec),0,16).toUShort();
        float rez = time_sec+time_msec*0.0001;
P.P.S. Может есть вариант проще? На костыль похоже
« Последнее редактирование: Июль 11, 2015, 16:20 от Nidxogg » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #5 : Июль 11, 2015, 17:25 »

Если уж вы со строками работаете, то и форируйте сразу строку как  число с точкой и ей делайте  toFloat.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Июль 12, 2015, 11:13 »

Да, цифры-то в десятичную я не перевел. Правильно так
Код
C++ (Qt)
inline short Hex2Dec( short val )
{
val = qFromBigEndian(val);
short sum = 0, bias = 1;
for (int i = 0; i < 4; ++i) {
 sum += (val & 0xF) * bias;
 bias *= 10;
 val >>= 4;
}
return sum;
}
 
float ReadStrangeFloat( QFile & file )
{
short temp[2];
file.readData((char *)  temp, 4);
return Hex2Dec(temp[0]) + Hex2Dec(temp[1]) / 10000.0f;
}
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #7 : Июль 12, 2015, 16:28 »

Код
C++ (Qt)
 
static float convert(QFile *file)
{
   QDataStream in(file, QIODevice::ReadOnly);
   in.setByteOrder(QDataStream::BigEndian);
   quint16 v1 = 0;
   quint16 v2 = 0;
   in >> v1 >> v2;
   const QString s = QString("%1.%2").arg(v1).arg(v2);
   return s.toFloat();
}
 
Записан

ArchLinux x86_64 / Win10 64 bit
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Июль 13, 2015, 07:26 »

Код
C++ (Qt)
...
   const QString s = QString("%1.%2").arg(v1).arg(v2);
...
 
Вот так и выходит что код "пользователя Qt" легко ускоряется в 4-5 раз  Улыбающийся
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #9 : Июль 13, 2015, 09:49 »

Зато прост и безопасен  Подмигивающий

Ну, можно еще (как-то так):

Код
C++ (Qt)
static float convert(QFile *file)
{
   QDataStream in(file, QIODevice::ReadOnly);
   in.setByteOrder(QDataStream::BigEndian);
   quint16 v1 = 0;
   quint16 v2 = 0;
   in >> v1 >> v2;
   return v1 + (v2/10000.0);
}
 
« Последнее редактирование: Июль 13, 2015, 09:54 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.155 секунд. Запросов: 23.