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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Проблема с преобразованием hex -> int  (Прочитано 11606 раз)
puh
Гость
« : Август 12, 2014, 11:04 »

Добрый день всем.

Столкнулся с проблемой преобразования из hex в int.
Код:
Код:
    QString str = "FFFFFFF5";
    bool t;
    qDebug() << str.toInt(&t, 16) << t;
дает результат:
Код:
0 false
Но это hex-число равно на самом деле -11.

Подскажите, плз, как заставить программу правильно преобразовывать подобные знаковые hex-значения?
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Август 12, 2014, 11:22 »

"FFFFFFF5" = 4 294 967 285
int = от -2147483648 до 2147483647

Используйте toULong или toLongLong Подмигивающий
Записан

puh
Гость
« Ответ #2 : Август 12, 2014, 11:40 »

А как же тогда такой код:
Код:
qDebug() << QString::number(-11, 16);
, который выдает результат:
Код:
"fffffffffffffff5"
??

Проблема получается в том, что программа не понимает, что перед ней отрицательное число, и она старший разряд (равный 1) не воспринимает как знаковый разряд. Но как же ей тогда это подсказать??
« Последнее редактирование: Август 12, 2014, 11:47 от puh » Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #3 : Август 12, 2014, 11:45 »

Код:
    bool t;
    unsigned int tmp = str.toUInt(&t, 16);
    int result;
    memcpy(&result, &tmp, sizeof(tmp));
    qDebug() << result << t;
Записан
puh
Гость
« Ответ #4 : Август 12, 2014, 11:51 »

Код:
    bool t;
    unsigned int tmp = str.toUInt(&t, 16);
    int result;
    memcpy(&result, &tmp, sizeof(tmp));
    qDebug() << result << t;

Спасибо.
Принцип понятен. НО почему так через ж.. приходится? Получается, что проще этого не сделать, т.е. сразу из строки в "-11" (-15, -111)?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Август 12, 2014, 12:06 »

Извращенцы. Смеющийся

Код
C++ (Qt)
const QString str = "FFFFFFF5";
bool t = false;
const int result = str.toUInt(&t, 16);
 
qDebug() << result << t;
 
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #6 : Август 12, 2014, 12:10 »

Ещё
Код:
    QByteArray arr("\xF5\xFF\xFF\xFF", 4);
    int result;
    memcpy(&result, arr.constData(), sizeof(result));
    qDebug() << result;
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #7 : Август 12, 2014, 12:14 »

Извращенцы. Смеющийся

Код
C++ (Qt)
const QString str = "FFFFFFF5";
bool t = false;
const int result = str.toUInt(&t, 16);
 
qDebug() << result << t;
 
Я не силён в ухищрениях, но почему компилятор не ругается на преобразование типа? Вдруг я там ошибся?
Почему я в цикле for когда сравниваю int и uint, происходят предупреждения, а тут нет?
Записан
puh
Гость
« Ответ #8 : Август 12, 2014, 12:16 »

Извращенцы. Смеющийся

Код
C++ (Qt)
const QString str = "FFFFFFF5";
bool t = false;
const int result = str.toUInt(&t, 16);
 
qDebug() << result << t;
 

Это уже по-божески, хотя тоже из разряда "кручу-верчу нае.. хочу".

Спасибо всем за помощь.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #9 : Август 12, 2014, 12:17 »

Извращенцы. Смеющийся

Код
C++ (Qt)
const QString str = "FFFFFFF5";
bool t = false;
const int result = str.toUInt(&t, 16);
 
qDebug() << result << t;
 
Я не силён в ухищрениях, но почему компилятор не ругается на преобразование типа? Вдруг я там ошибся?
Почему я в цикле for когда сравниваю int и uint, происходят предупреждения, а тут нет?
Тут никакого сравнения, а обычный каст.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #10 : Август 12, 2014, 12:18 »

Ещё
Код:
    QByteArray arr("\xF5\xFF\xFF\xFF", 4);
    int result;
    memcpy(&result, arr.constData(), sizeof(result));
    qDebug() << result;
Фтопку твой memcpy, ты на плюсах пишешь или где?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #11 : Август 12, 2014, 12:28 »

Блин. Никак не укладывается в голове. Это какое-то из волшебств const.
Можно и так даже
Код:
float result = static_cast<const float>(str.toUInt(&t, 16));
Чтоб float получить из hex
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Август 12, 2014, 12:29 »

Я не силён в ухищрениях, но почему компилятор не ругается на преобразование типа? Вдруг я там ошибся?
Почему я в цикле for когда сравниваю int и uint, происходят предупреждения, а тут нет?
Проблемы возможны на сравнении, а присвоение/инициализация безопасны

В Qt сделано нормально, нужно задавать знак явно (а не делать предположения), напр
Код
C++ (Qt)
bool ok;
QString str("-F5");
int i = str.toInt(&ok, 16);
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Август 12, 2014, 12:35 »

Блин. Никак не укладывается в голове. Это какое-то из волшебств const.
Можно и так даже
Код:
float result = static_cast<const float>(str.toUInt(&t, 16));
Чтоб float получить из hex
Ну а const здесь зачем? Улыбающийся Здесь уже будет перевод во флоат. А при int/uint никаких конверсий не происходит, их биты совершенно равны, напр
Код
C++ (Qt)
unsigned int a1 = 0xFFFFFFF5;
int a2 = -11;
bool eq = (a1 == a2);
qDebug() << a1 << a2 << eq;
 
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #14 : Август 12, 2014, 12:57 »

Всё понял. Ключевой фразой было
присвоение/инициализация безопасны
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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