Задать вопрос
@mrZurg

Qt — Как преобразовать int в QByteArray?

Вообщем необходимо в Qt число int преобразовать в массив байтов QByteArray:
пока делаю так:
i
nt valueRange; //задаем valueRange 
 
char a = ( valueRange >> 24 )& 0xFF;
char b = ( valueRange >> 16 )& 0xFF;
char c = ( valueRange >> 8 )& 0xFF;
char d = valueRange & 0xFF;
 
byte->append(a);
byte->append(b);
byte->append(c);
byte->append(d);
 
qDebug() << " val:" << valueRange << " = " << (int)a <<"*"<<(int)b<<"*"<<(int)c<<"*"<<(int)d;


Но при выводе получаю например это:
val: -291 = -1 * -1 * -2 * -35
val: -141 = -1 * -1 * -1 * 115
val: -200 = -1 * -1 * -1 * 56
val: 105 = 0 * 0 * 0 * 105


Как то не правильно вроде работает.
Возможно есть какой-то стандартный способ? это же Qt.
  • Вопрос задан
  • 8489 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 3
gbg
@gbg
Любые ответы на любые вопросы
Вы не учли два важных факта - что char - знаковый тип и что не на всех машинах четырехбайтное число хранится в памяти в соответствии с порядком разрядов. (Остроконечные и тупоконечные архитектуры).

Если числа нужно передавать по сети, их следует конвертировать в сетевой порядок байт. Это делает семейство методов hton...(). Обратное преобразование делают методы ntoh...().

В QByteArray можно затолкать вот так:
int i=42;
QByteArray s=QByteArray::fromRawData(reinterpret_cast<const char*>(i),sizeof(i));
Ответ написан
Комментировать
@Lol4t0
Да не все норм

>>> ((-1&0xff) << 24) + ((-1&0xff) << 16) + ((-2&0xff) << 8) + (-35 &0xff) & 0xffffffff 
4294967005
>>> (-291) & 0xffffffff
4294967005


Нужно только понимать, что сдвиг вправо отрицательного числа - implementation defined behaviour, т.е. результаты будут вразумительными, но могут меняться в зависимости от платформы и компилятора.

(stackoverflow.com/questions/4009885/arithmetic-bit...)
Ответ написан
Комментировать
@Khanik
#include
#include
#include
#include

int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);

int i = 1045632159;
QByteArray byteArray;
QDataStream stream(&byteArray, QIODevice::WriteOnly);

stream << i;

int newValue = qFromBigEndian( (const uchar*)byteArray.constData() );

qDebug() << " newValue: " << newValue;

return app.exec();
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы