快速将quint16/unsigned short添加到QByteArray中

Append quint16/unsigned short to QByteArray quickly

本文关键字:添加 QByteArray short unsigned quint16      更新时间:2023-10-16

在我的项目中,我正在使用QByteArrays在程序运行时向它们附加数据。大多数情况下,使用QByteArray::append()可以很好地附加一个简单的quint8。但是当quint16被附加时,只附加1字节而不是2字节。

QByteArray ba = QByteArray::fromHex("010203");
quint number(300);//300 in hex is 012c
ba.append(number);//What should be appended instead of just number?
//the current incorrect result is
ba.toHex() == "0102032c"
//the desired result is
ba.toHex() == "010203012c"

我已经尝试过了,但它只是插入值作为一个字符串(4字节):

ba.append(QByteArray::number(number, 16));

我应该追加什么到QByteArray,所以两个字节的"数字"得到追加,而不是仅仅一个字节?此外,最快的方法可能是首选,因为这个程序需要有很大的性能时间。所以绝对不能转换为qstring。

感谢您的宝贵时间。

QByteArray本身只支持附加字节;要附加固定大小的整数类型的大端表示,您可以使用适当的位移位构建自己的operator<<(或其他您喜欢的)重载:

QByteArray &operator<<(QByteArray &l, quint8 r)
{
    l.append(r);
    return l;
}
QByteArray &operator<<(QByteArray &l, quint16 r)
{
    return l<<quint8(r>>8)<<quint8(r);
}
QByteArray &operator<<(QByteArray &l, quint32 r)
{
    return l<<quint16(r>>16)<<quint16(r);
}

允许您编写如下代码:

QByteArray b;
b<<quint16(300);     // appends 0x01 0x2c
b<<quint8(4);        // appends 0x04
b<<quint16(4);       // appends 0x00 0x04
b<<quint32(123456);  // appends 0x00 0x01 0xe2 0x40
b<<quint8(1)<<quin16(2)<<quint32(3); // appends 0x01 0x00 0x02 0x00 0x00 0x00 0x03

你应该避免写

QByteArray b;
b<<1;

因为理论上输出取决于当前平台整数的大小(尽管Qt int支持的所有平台上的AFAIK都是32位)。