QByteArray в целое число

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

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

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

на q_size is 0x2500 (или другой порядок endianness -0x0025).

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

8 ответов


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


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

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

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

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

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


у меня были большие проблемы с преобразованием последовательных данных (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..

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

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, от index = 1 до 4-целое число массива.


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


bool ok;
q_size.toHex().toInt(&ok, 16);

для меня


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

QByteArray Documentatio: http://doc.qt.io/qt-5/QByteArray.html