crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> double и его hex представление
novichkov
  опции профиля:
сообщение 22.2.2012, 14:00
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 64
Регистрация: 20.3.2008
Из: Северодвинск
Пользователь №: 128

Спасибо сказали: 6 раз(а)




Репутация:   1  


Знатоки низкоуровневых функций C/C++! Помогите, пожалуйста, решить проблему.

В одной не очень хорошо написанной программе в файлы описаний данных, которые представляют собой простые ini файлы, разработчик программы пишет действительные параметры в виде
AmplLevel=(0BC0000000000000) <- строковое представление числа в формате double
XStep=(00000000) <- строковое представление числа в формате float

Мне нужно декодировать эти строки, то есть получить соответствующие значения параметров.
Для float решение простое:

char *hex_string = ....
float f;
sscanf(hex_string,"%x",&f);

А вот для double это не работает. Подскажите, как можно переконвертировать строку, чтобы получить нужный результат?

Для справки:
0x 3ff0 0000 0000 0000 = 1
0x 3ff0 0000 0000 0001 ≈ 1.0000000000000002, the next higher number > 1
0x 3ff0 0000 0000 0002 ≈ 1.0000000000000004
0x 4000 0000 0000 0000 = 2
0x c000 0000 0000 0000 = –2
0x3fd5 5555 5555 5555 = 0.333333333333333314829616256247390992939472198486328125
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
novichkov
  опции профиля:
сообщение 22.2.2012, 14:59
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 64
Регистрация: 20.3.2008
Из: Северодвинск
Пользователь №: 128

Спасибо сказали: 6 раз(а)




Репутация:   1  


Сейчас сделал такую версию:

double hextodouble(const QString &hex)
{
double result=0.0l;

QByteArray ba;
QDataStream stream(&ba, QIODevice::WriteOnly);
for (int i=0; i<16; i+=2) {
quint8 c = hex.mid(i,2).toUInt(0,16);
stream<<c;
}

QDataStream stream1(&ba, QIODevice::ReadOnly);
stream1 >> result;

return result;
}

Но она слишком тяжеловесна.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Влад
  опции профиля:
сообщение 22.2.2012, 16:52
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 146
Регистрация: 20.3.2009
Из: Санкт-Петербург
Пользователь №: 627

Спасибо сказали: 46 раз(а)




Репутация:   8  


Тебе нужно просто интерпретировать последовательность байтов как значение другого типа.
    long long x = 0x3ff0000000000000;
    double d = reinterpret_cast<double&>(x);
    std::cout << d << std::endl;
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
novichkov
  опции профиля:
сообщение 22.2.2012, 17:46
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 64
Регистрация: 20.3.2008
Из: Северодвинск
Пользователь №: 128

Спасибо сказали: 6 раз(а)




Репутация:   1  


Да, так значительно проще :)

Сделал так:

QString hex=..... 
long long x=hex.toLongLong(0,16);
double d = reinterpret_cast<double&>(x);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 22.2.2012, 19:34
Сообщение #5


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


novichkov, я бы того программиста, который так сохраняет в ini.... Работать уборщицей! Пожизненно!!

Сообщение отредактировал Алексей1153 - 22.2.2012, 19:35
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
novichkov
  опции профиля:
сообщение 22.2.2012, 19:42
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 64
Регистрация: 20.3.2008
Из: Северодвинск
Пользователь №: 128

Спасибо сказали: 6 раз(а)




Репутация:   1  


Цитата(Алексей1153 @ 22.2.2012, 20:34) *
novichkov, я бы того программиста, который так сохраняет в ini.... Работать уборщицей! Пожизненно!!


А еще в этой программе, написанной, кстати, в Delphi, после определенного времени работы заканчиваются дескрипторы (или как их там), отвечающие на выделение графических ресурсов в Windows, и программа зависает. Приходится перезапускать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Влад
  опции профиля:
сообщение 23.2.2012, 11:00
Сообщение #7


Участник
**

Группа: Участник
Сообщений: 146
Регистрация: 20.3.2009
Из: Санкт-Петербург
Пользователь №: 627

Спасибо сказали: 46 раз(а)




Репутация:   8  


Цитата(Алексей1153 @ 22.2.2012, 20:34) *
.... я бы того программиста, который так сохраняет в ini.... Работать уборщицей! Пожизненно!!

Я думаю, рубить сплеча не следует - мы же не знаем, какие основания были у программиста сохранять именно так, а не иначе.... А вот тот факт, что эти самые основания никак не отражены в проектной документации (а есть ли вообще проектная документация?) - это явный косяк, за который нужно как минимум завоспитывать до слез. Причем скорее всего не программиста-кодера, а архитекта, который либо придумал эту "фичу" и никак не описал, почему, либо допустил в этом отношении самодеятельность программиста без всяких видимых оснований.
Ну и если заканчиваются дескрипторы - это тоже косяк, причем тут воспитывать нужно уже QA, тестеров и менеджера проекта....
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 24.2.2012, 8:36
Сообщение #8


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(novichkov @ 22.2.2012, 22:42) *
после определенного времени работы заканчиваются дескрипторы (или как их там), отвечающие на выделение графических ресурсов в Windows, и программа зависает. Приходится перезапускать.

не освобождаются хендлы контекста устройства (по-дельфийски контекст обозван "канвой") , шрифтов, битмапов и т.д. Это надо перетряхнуть код рисования и расставить вызовы освобождения сооттветствующих ресурсов там, где это не сделано. Как выцепить?

1) для начала запускаешь программу в обычном режиме. Открываешь диспетчер задач, показываешь там в процессах колонку "дескрипторы" и "объекты GDI". При перерисовках графики эти числа будут расти для процесса программы (и это есть неправильно)
2) комментируешь весь код отрисовки. Запускаешь. В диспетчере счётчики должны остановиться на определённом среднем значении (если проблема именно в коде отрисовки, возможно не только там. По интенсивности изменения счётчиков это можно определить)
3) потихоньку открывать графику и вносить исправления

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

Влад, ну, начнём с того, что проще было в бинарник писать, а не ascii ) Раз уж такая пьянка. Ну а рубить - это да. Сначала рубить, потом научить правильно )))

Сообщение отредактировал Алексей1153 - 24.2.2012, 9:14
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 20:16