QByteArray :: append()导致意外的QByteArray大小

时间:2017-09-17 01:44:29

标签: c++ qt qbytearray

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?
}

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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

这使你的意图变得清晰,它避免了union技巧,无论如何都是未定义的行为。