【问题标题】:Append quint16/unsigned short to QByteArray quickly快速将 quint16/unsigned short 附加到 QByteArray
【发布时间】:2015-08-20 00:37:36
【问题描述】:

在我的项目中,我正在使用 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 以便“数字”的两个字节都被附加而不是一个字节?此外,由于该程序需要较长的执行时间,因此首选可能的最快方法。所以绝对不能转换为 QStrings。

感谢您的宝贵时间。

【问题讨论】:

  • 附加 quint16 时,您期望什么字节序?
  • 我相信大端。应该是 012c 被追加
  • 阅读文档我看不到QByteArray.append(quint)...
  • 为什么不直接使用QList<quint16>
  • 因为 QByteArray 不仅仅是帖子中所述的一堆 quint16。

标签: c++ qt qbytearray


【解决方案1】:

就其本身而言,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 位的)。

【讨论】:

  • 完美运行。非常感谢您的快速回答:)
  • 讨厌问这个,但是倒退怎么样?那么从包含“012c”的 QByteArray 到 qint16 呢?我已经尝试过 ba.mid(3,2).toUShort(0,16) 但这不起作用,因为它不查看二进制数据。
  • 要将大端值读取为整数,通常的方法是“读取的每个字节将目标左移 8 位,并将读取的字节或读取到目标中”。使用跟踪读取位置的实际流更容易做到这一点。
猜你喜欢
  • 2012-02-25
  • 1970-01-01
  • 2019-02-07
  • 2014-06-09
  • 2013-07-20
  • 2020-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多