首页 > 解决方案 > Qt:从固定字节数到整数

问题描述

使用 Qt5.4,我构建了函数generateRandomIDOver2Bytes. 它生成一个随机数并将其放入一个恰好占据两个字节的变量中。

QByteArray generateRandomIDOver2Bytes() {
    QString randomValue = QString::number(qrand() % 65535);
    QByteArray x;
    x.setRawData(randomValue.toLocal8Bit().constData(), 2);
    return x;
}

我的问题是恢复如此生成的值,以便再次获得一个整数。以下最小示例实际上不起作用:

QByteArray tmp = generateRandomIDOver2Bytes(); //for example, the value 27458 
int value = tmp.toUInt(); 
qDebug() << value; //it prints always 9

任何想法?

标签: c++qtqt5byteqbytearray

解决方案


一个 16 位整数可以通过位操作拆分成单独的字节。

这样,它可以存储到一个QByteArray.

来自 Qt 文档。QByteArray的:

QByteArray 可用于存储原始字节(包括“\0”)和传统的 8 位“\0”结尾的字符串。

对于恢复,也可以使用位操作。

的内容QByteArray不一定会产生可打印的字符,但在这种情况下可能不需要(或不应该)。

testQByteArrayWithUShort.cc

#include <QtCore>

int main()
{
  quint16 r = 65534;//qrand() % 65535;
  qDebug() << "r:" << r;
  // storing r in QByteArray (little endian)
  QByteArray qBytes(2, 0); // reserve space for two bytes explicitly
  qBytes[0] = (uchar)r;
  qBytes[1] = (uchar)(r >> 8);
  qDebug() << "qBytes:" << qBytes;
  // recovering r
  quint16 rr = qBytes[0] | qBytes[1] << 8;
  qDebug() << "rr:" << rr;
}

输出:

r: 65534
qBytes: "\xFE\xFF"
rr: 65534

推荐阅读