Russian Qt Forum

Программирование => С/C++ => Тема начата: Nidxogg от Июль 11, 2015, 11:34



Название: Преобразовать "hex" в float
Отправлено: Nidxogg от Июль 11, 2015, 11:34
Добрый день
Имеется бинарный файл. Если открыть его HEX-просмотрщике (к примеру, в total commander), то можно увидеть значение 00 97 35 54
Как можно преобразовать это значение во float 97.3554?


Название: Re: Преобразовать "hex" в float
Отправлено: Igors от Июль 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 шорта


Название: Re: Преобразовать "hex" в float
Отправлено: Nidxogg от Июль 11, 2015, 13:21
Формат действительно самопальный, но заказчик хочет
Сам сделал через QString, ваш вариант получше

Благодарю.


Название: Re: Преобразовать "hex" в float
Отправлено: Old от Июль 11, 2015, 13:32
Сам сделал через QString, ваш вариант получше
Только он не работает.
0x97 (hex) != 97 (dec)



Название: Re: Преобразовать "hex" в float
Отправлено: Nidxogg от Июль 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. Может есть вариант проще? На костыль похоже


Название: Re: Преобразовать "hex" в float
Отправлено: Old от Июль 11, 2015, 17:25
Если уж вы со строками работаете, то и форируйте сразу строку как  число с точкой и ей делайте  toFloat.


Название: Re: Преобразовать "hex" в float
Отправлено: Igors от Июль 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;
}


Название: Re: Преобразовать "hex" в float
Отправлено: kuzulis от Июль 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();
}
 


Название: Re: Преобразовать "hex" в float
Отправлено: Igors от Июль 13, 2015, 07:26
Код
C++ (Qt)
...
   const QString s = QString("%1.%2").arg(v1).arg(v2);
...
 
Вот так и выходит что код "пользователя Qt" легко ускоряется в 4-5 раз  :)


Название: Re: Преобразовать "hex" в float
Отправлено: kuzulis от Июль 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);
}