快速将 quint16/unsigned short 添加到 QByteArray
Append quint16/unsigned short to QByteArray quickly
在我的项目中,我正在使用 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 追加什么以便追加 "number" 的两个字节而不是只追加一个字节?此外,最好采用尽可能最快的方法,因为该程序需要具有出色的性能时间。所以绝对不要转换为 QStrings。
谢谢你的时间。
就其本身而言,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 位)。
在我的项目中,我正在使用 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 追加什么以便追加 "number" 的两个字节而不是只追加一个字节?此外,最好采用尽可能最快的方法,因为该程序需要具有出色的性能时间。所以绝对不要转换为 QStrings。
谢谢你的时间。
就其本身而言,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 位)。