Russian Qt Forum

Qt => Общие вопросы => Тема начата: puh от Август 12, 2014, 11:04



Название: Проблема с преобразованием hex -> int
Отправлено: puh от Август 12, 2014, 11:04
Добрый день всем.

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

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


Название: Re: Проблема с преобразованием hex -> int
Отправлено: gil9red от Август 12, 2014, 11:22
"FFFFFFF5" = 4 294 967 285
int = от -2147483648 до 2147483647

Используйте toULong или toLongLong ;)


Название: Re: Проблема с преобразованием hex -> int
Отправлено: puh от Август 12, 2014, 11:40
А как же тогда такой код:
Код:
qDebug() << QString::number(-11, 16);
, который выдает результат:
Код:
"fffffffffffffff5"
??

Проблема получается в том, что программа не понимает, что перед ней отрицательное число, и она старший разряд (равный 1) не воспринимает как знаковый разряд. Но как же ей тогда это подсказать??


Название: Re: Проблема с преобразованием hex -> int
Отправлено: __Heaven__ от Август 12, 2014, 11:45
Код:
    bool t;
    unsigned int tmp = str.toUInt(&t, 16);
    int result;
    memcpy(&result, &tmp, sizeof(tmp));
    qDebug() << result << t;


Название: Re: Проблема с преобразованием hex -> int
Отправлено: puh от Август 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)?


Название: Re: Проблема с преобразованием hex -> int
Отправлено: Пантер от Август 12, 2014, 12:06
Извращенцы. ;D

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


Название: Re: Проблема с преобразованием hex -> int
Отправлено: __Heaven__ от Август 12, 2014, 12:10
Ещё
Код:
    QByteArray arr("\xF5\xFF\xFF\xFF", 4);
    int result;
    memcpy(&result, arr.constData(), sizeof(result));
    qDebug() << result;


Название: Re: Проблема с преобразованием hex -> int
Отправлено: __Heaven__ от Август 12, 2014, 12:14
Извращенцы. ;D

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


Название: Re: Проблема с преобразованием hex -> int
Отправлено: puh от Август 12, 2014, 12:16
Извращенцы. ;D

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

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

Спасибо всем за помощь.


Название: Re: Проблема с преобразованием hex -> int
Отправлено: Пантер от Август 12, 2014, 12:17
Извращенцы. ;D

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


Название: Re: Проблема с преобразованием hex -> int
Отправлено: Пантер от Август 12, 2014, 12:18
Ещё
Код:
    QByteArray arr("\xF5\xFF\xFF\xFF", 4);
    int result;
    memcpy(&result, arr.constData(), sizeof(result));
    qDebug() << result;
Фтопку твой memcpy, ты на плюсах пишешь или где?


Название: Re: Проблема с преобразованием hex -> int
Отправлено: __Heaven__ от Август 12, 2014, 12:28
Блин. Никак не укладывается в голове. Это какое-то из волшебств const.
Можно и так даже
Код:
float result = static_cast<const float>(str.toUInt(&t, 16));
Чтоб float получить из hex


Название: Re: Проблема с преобразованием hex -> int
Отправлено: Igors от Август 12, 2014, 12:29
Я не силён в ухищрениях, но почему компилятор не ругается на преобразование типа? Вдруг я там ошибся?
Почему я в цикле for когда сравниваю int и uint, происходят предупреждения, а тут нет?
Проблемы возможны на сравнении, а присвоение/инициализация безопасны

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


Название: Re: Проблема с преобразованием hex -> int
Отправлено: Igors от Август 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;
 


Название: Re: Проблема с преобразованием hex -> int
Отправлено: __Heaven__ от Август 12, 2014, 12:57
Всё понял. Ключевой фразой было
присвоение/инициализация безопасны


Название: Re: Проблема с преобразованием hex -> int
Отправлено: __Heaven__ от Август 12, 2014, 13:02
Я не силён в ухищрениях, но почему компилятор не ругается на преобразование типа? Вдруг я там ошибся?
Почему я в цикле for когда сравниваю int и uint, происходят предупреждения, а тут нет?
Проблемы возможны на сравнении, а присвоение/инициализация безопасны

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

-F5 дает -245


Название: Re: Проблема с преобразованием hex -> int
Отправлено: Igors от Август 12, 2014, 13:17
-F5 дает -245
Правильно дает -(15 * 16 + 5) = -245


Название: Re: Проблема с преобразованием hex -> int
Отправлено: __Heaven__ от Август 12, 2014, 13:27
Я не вижу способа получения -11 из FFFFFFF5 этим методом.


Название: Re: Проблема с преобразованием hex -> int
Отправлено: Old от Август 12, 2014, 13:34
Я не вижу способа получения -11 из FFFFFFF5 этим методом.
0x100000000 - 0xFFFFFFF5 = 0x0B (11)


Название: Re: Проблема с преобразованием hex -> int
Отправлено: __Heaven__ от Август 12, 2014, 13:36
Я не вижу способа получения -11 из FFFFFFF5 этим методом.
0x100000000 - 0xFFFFFFF5 = 0x0B (11)
Согласен, только это не позволит красиво записать решение в одну строчку.


Название: Re: Проблема с преобразованием hex -> int
Отправлено: Old от Август 12, 2014, 13:41
Согласен, только это не позволит красиво записать решение в одну строчку.
Про какое решение речь?


Название: Re: Проблема с преобразованием hex -> int
Отправлено: __Heaven__ от Август 12, 2014, 13:47
Перевод QString("FFFFFFF5")


Название: Re: Проблема с преобразованием hex -> int
Отправлено: Old от Август 12, 2014, 14:21
Перевод QString("FFFFFFF5")
Уже же все написали. Если вы хотите получить число со знаком, то и использовать нужно число со знаком.


Название: Re: Проблема с преобразованием hex -> int
Отправлено: manarch от Август 13, 2014, 09:20
Добрый день всем.

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

Код
C++ (Qt)
QString str = QString("0xFFFFFFF5");
QTextStream stream(&str);
int v = 0;
stream>>hex>>v;
qDebug()<<v;
 

ЗЫ: без "0x" не прокатывает!