double и его hex представление |
Здравствуйте, гость ( Вход | Регистрация )
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 |
Тебе нужно просто интерпретировать последовательность байтов как значение другого типа.
|
|
|
novichkov |
22.2.2012, 17:46
Сообщение
#4
|
Студент Группа: Участник Сообщений: 64 Регистрация: 20.3.2008 Из: Северодвинск Пользователь №: 128 Спасибо сказали: 6 раз(а) Репутация: 1 |
Да, так значительно проще
Сделал так:
|
|
|
Алексей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 |
novichkov, я бы того программиста, который так сохраняет в ini.... Работать уборщицей! Пожизненно!! А еще в этой программе, написанной, кстати, в Delphi, после определенного времени работы заканчиваются дескрипторы (или как их там), отвечающие на выделение графических ресурсов в Windows, и программа зависает. Приходится перезапускать. |
|
|
Влад |
23.2.2012, 11:00
Сообщение
#7
|
Участник Группа: Участник Сообщений: 146 Регистрация: 20.3.2009 Из: Санкт-Петербург Пользователь №: 627 Спасибо сказали: 46 раз(а) Репутация: 8 |
.... я бы того программиста, который так сохраняет в ini.... Работать уборщицей! Пожизненно!! Я думаю, рубить сплеча не следует - мы же не знаем, какие основания были у программиста сохранять именно так, а не иначе.... А вот тот факт, что эти самые основания никак не отражены в проектной документации (а есть ли вообще проектная документация?) - это явный косяк, за который нужно как минимум завоспитывать до слез. Причем скорее всего не программиста-кодера, а архитекта, который либо придумал эту "фичу" и никак не описал, почему, либо допустил в этом отношении самодеятельность программиста без всяких видимых оснований. Ну и если заканчиваются дескрипторы - это тоже косяк, причем тут воспитывать нужно уже QA, тестеров и менеджера проекта.... |
|
|
Алексей1153 |
24.2.2012, 8:36
Сообщение
#8
|
фрилансер Группа: Участник Сообщений: 2939 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
после определенного времени работы заканчиваются дескрипторы (или как их там), отвечающие на выделение графических ресурсов в Windows, и программа зависает. Приходится перезапускать. не освобождаются хендлы контекста устройства (по-дельфийски контекст обозван "канвой") , шрифтов, битмапов и т.д. Это надо перетряхнуть код рисования и расставить вызовы освобождения сооттветствующих ресурсов там, где это не сделано. Как выцепить? 1) для начала запускаешь программу в обычном режиме. Открываешь диспетчер задач, показываешь там в процессах колонку "дескрипторы" и "объекты GDI". При перерисовках графики эти числа будут расти для процесса программы (и это есть неправильно) 2) комментируешь весь код отрисовки. Запускаешь. В диспетчере счётчики должны остановиться на определённом среднем значении (если проблема именно в коде отрисовки, возможно не только там. По интенсивности изменения счётчиков это можно определить) 3) потихоньку открывать графику и вносить исправления если до кода нет доступа, то для уменьшения частоты падений не следует по окну программы возить другими окнами - лучше просто сворачивать окно программы в таск бар, когда оно не нужно Влад, ну, начнём с того, что проще было в бинарник писать, а не ascii ) Раз уж такая пьянка. Ну а рубить - это да. Сначала рубить, потом научить правильно ))) Сообщение отредактировал Алексей1153 - 24.2.2012, 9:14 |
|
|
Текстовая версия | Сейчас: 29.4.2024, 18:15 |