QByteArray to integer - PullRequest
       37

QByteArray to integer

9 голосов
/ 09 августа 2009

Как вы, наверное, поняли из названия, у меня проблемы с преобразованием QByteArray в целое число.

 QByteArray buffer = server->read(8192);
 QByteArray q_size = buffer.mid(0, 2);
 int size = q_size.toInt();

Однако size равно 0. buffer не получает никакого символа ASCII, и я считаю, что функция toInt() не будет работать, если это не символ ASCII. int size должно быть 37 (0x25), но - как я уже сказал - это 0.

q_size равен 0x2500 (или другому порядку байтов - 0x0025).

В чем здесь проблема? Я почти уверен, что q_size содержит данные, которые мне нужны.

Ответы [ 8 ]

21 голосов
/ 11 августа 2009

Примерно так должно работать, используя поток данных для чтения из буфера:

QDataStream ds(buffer);
short size; // Since the size you're trying to read appears to be 2 bytes
ds >> size;

// You can continue reading more data from the stream here
9 голосов
/ 09 августа 2009

Метод toInt анализирует int, если QByteArray содержит строку с цифрами. Вы хотите интерпретировать необработанные биты как целое число. Я не думаю, что есть метод для этого в QByteArray, поэтому вам придется самим строить значение из отдельных байтов. Вероятно, что-то вроде этого будет работать:

int size = (static_cast<unsigned int>(q_size[0]) & 0xFF) << 8
         + (static_cast<unsigned int>(q_size[1]) & 0xFF);

(или наоборот, в зависимости от Endianness)

8 голосов
/ 10 августа 2009

Я сам не пробовал это проверить, работает ли он, но из документации Qt видно, что вы хотите QDataStream. Это поддерживает извлечение всех основных типов C ++ и может быть создано с помощью QByteArray в качестве входных данных.

1 голос
/ 10 августа 2016

У меня были большие проблемы с преобразованием последовательных данных (QByteArray) в целое число, которое предполагалось использовать в качестве значения для Progress Bar, но я решил их очень просто:

QByteArray data = serial->readall();
QString data2 = tr(data); //converted the byte array to a string
ui->QProgressBar->setValue(data2.toUInt()); //converted the string to an unmarked integer..
1 голос
/ 02 сентября 2015
bool ok;
q_size.toHex().toInt(&ok, 16);

у меня работает

0 голосов
/ 21 марта 2018

Попробуйте toInt(bool *ok = Q_NULLPTR, int base = 10) const метод класса QByteArray.

Документация QByteArray: http://doc.qt.io/qt-5/QByteArray.html

0 голосов
/ 04 мая 2014

Создайте QDataStream, который работает с вашим QByteArray. Документация здесь

0 голосов
/ 10 июня 2011

Это работает для меня:

QByteArray array2;
        array2.reserve(4);
        array2[0] = data[1];
        array2[1] = data[2];
        array2[2] = data[3];
        array2[3] = data[4];

        memcpy(&blockSize, array2, sizeof(int));

data - массив qbytearray, от индекса = 1 до 4 - целое число массива.

...