【问题标题】:QByteArray::append() leads to unexpected QByteArray sizesQByteArray::append() 导致意外的 QByteArray 大小
【发布时间】:2018-02-25 20:21:52
【问题描述】:
QByteArray array;
union {
   char bytes[sizeof(float)];
   float value;
} myFloat;

for (int i = 0; i < 10; i++) {
    myFloat.value = 2.3 + i;
    array.append(myFloat.bytes);
    qDebug() << array.length(); //9, 18, 27, etc, instead of 4, 8, 12, etc?
}

嘿,我正在尝试构建一个 QByteArray 以在稍后阶段通过 TCP 存储和发送,通过QTcpSocket::write(QByteArray);。但是,数组的长度增加不是我所期望的,当我通过 Tcp 发送它时,我的 readHandler 似乎在第一次浮点数之后开始读取乱码。这似乎可以通过使用另一个附加函数array.append(float.bytes, sizeof(float)); 来解决。有谁知道:

  • 首先出了什么问题?为什么添加 4 字节字符会导致 9 字节长的 QByteArray?是否与添加 \o 有关?
  • array.append(float.bytes, sizeof(float)); 方法有效吗?意思是,如果我发送数组,我会发送 10*4 字节的原始浮点值吗?

【问题讨论】:

  • QByteArray::append 怎么会知道你想准确地追加 4 个字节?它需要一个以 nul 结尾的 c 字符串,而不是一大块二进制字节。
  • 好点。我没想到。所以我基本上是在读取 QByteArray 的随机内存?这是否意味着QByteArray::append(char*, len) 将正确读取二进制字节块?
  • QByteArray &amp;QByteArray::append(const char *str, int len) 是您所需要的。

标签: c++ qt qbytearray


【解决方案1】:

您(无意中)选择的append() 重载将传递的参数视为以零结尾的字符串。显然,float 值似乎在某些时候包含一个零字节,因此append() 函数最终会停止读取。

要附加 二进制 数据,我会使用 QByteArray::fromRawData() 获取 QByteArray 然后附加它:

float f = 3.14;
QByteArray a = QByteArray::fromRawData(&f, sizeof(f));
QByteArray b;
b += a;

这使您的意图明确,并且避免了 union 技巧,无论如何这是未定义的行为。

【讨论】:

  • 联合技巧只要是char 就有效。只有union { int i; float f; } 是 UB。
猜你喜欢
  • 2015-12-15
  • 2013-12-01
  • 2014-06-15
  • 2018-10-19
  • 2016-07-07
  • 2015-09-28
  • 2013-12-25
  • 2023-03-24
  • 2014-03-07
相关资源
最近更新 更多