Qt: преобразование десятичной дроби в шестнадцатеричную с 4 байтами

#qt #type-conversion #hex

#qt #преобразование типов #шестнадцатеричная

Вопрос:

Я использую Qt для преобразования десятичного числа в шестнадцатеричную строку

 QString hexvalue = QString("%1").arg(decimal, 8, 16, QLatin1Char( '0' ));
 

Я хочу иметь

1: 00 00 00 01

-1: FF FF FF FF

Однако этот код приводит к

FF FF FF FF FF FF FF FF и 00 00 00 01

Как я могу ограничить это до 4 байт?

Комментарии:

1. вы имеете в виду, что 1 анализируется в FF FF FF FF FF FF FF FF FF FF ???? o0?

2. Нет -1 выводится как FF FF FF FF FF FF FF FF

3. Использование QString("%1").arg(ulong(decimal), 8, 16, QLatin1Char( '0' ))

4. Почему ulong (unsigned long) ? Код должен корректно работать с отрицательными числами.

Ответ №1:

Для этого можно использовать маску с оператором AND :

 int val = -1;
qDebug() << QString("%1 : %2").arg(val).arg(val amp; 0xffffffff, 8, 16, QLatin1Char('0'));
 

отобразится

«-1: ffffffff»

Редактировать

Как и было запрошено в комментариях, вот один из способов получить переменную length в диапазоне 0 < length <= 8 :

 int mask = 0xffffffff >> (32 - 4 * length); // assuming a 32 bit integer
int val = -1;
qDebug() << QString("%1 : %2").arg(val).arg((unsigned int)(val amp; mask), length, 16, QLatin1Char('0'));
 

Комментарии:

1. Хорошо, но что, если я хочу, чтобы длина (8) была переменной?

2. предполагая 32-битное целое число, тогда уродливый взлом был бы int mask = 0xffffffff >> (32 - 4 * length); с 0 < length <= 8 плюс приведение (unsigned int)(val amp; mask) .

3. Можете ли вы обновить ответ, чтобы было очевидно, как реализовать комментарий в коде.