快速向QByteArray添加quint16/unsigned short

mrg*_*g95 3 c++ qt qbytearray

在我的项目中,我正在使用QByteArrays在程序进行时向他们追加数据.大多数时候,简单quint8的附加就好了QByteArray::append().但是当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"
Run Code Online (Sandbox Code Playgroud)

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

ba.append(QByteArray::number(number, 16));
Run Code Online (Sandbox Code Playgroud)

我应该将什么附加到QByteArray,以便"number"的两个字节都被附加而不是仅仅一个字节?此外,最好的方法是首选,因为该程序需要有很长的性能时间.所以绝对没有转换到QStrings.

谢谢你的时间.

Mat*_*lia 6

它本身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);
}
Run Code Online (Sandbox Code Playgroud)

这允许您编写如下代码:

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
Run Code Online (Sandbox Code Playgroud)

你应该避免写作

QByteArray b;
b<<1;
Run Code Online (Sandbox Code Playgroud)

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