将 QByteArray 转换为 double 数组

4

我有一个double类型的数组:

QVector<double> Y(count);

我需要将其打包成 QByteArray 以通过以太网发送。 所以我这样做了。这并不太难:
QByteArray line;
line.clear();
line.append(QByteArray::fromRawData(reinterpret_cast<const char*>(Y.data()),
count*sizeof(double)));

我尝试使用以下代码从 QByteArray recv 中解压数据:

QVector<double> data((line.size())/sizeof(double));
QByteArray dou(sizeof(double),0x0);
for(int i = 0; i<data.count(); i++){
    dou = recv.mid(i*sizeof(double),sizeof(double));
    data[i] = *reinterpret_cast<const double*>(dou.data());
    dou.clear();
}

但我不喜欢这样的方法。我想找到一种优雅的方式,从QByteArray解包成QVector<double>。你能帮忙吗?


注意:这不仅不够优雅,而且也很脆弱和不可移植。 - Frank Osterfeld
2个回答

8
你可以使用QDataStream来以二进制格式编码数据,采用特定格式。(具体来说,首先是项目数(int32),然后是每个项目)QVector提供了流操作符的重载
QByteArray line;
QDataStream stream(&line, QIODevice::WriteOnly);
stream << y;

并且阅读:

QVector<double> data;
QDataStream stream(line);
stream >> data;

0
通常的做法是将数据序列化为文本。这样可以使您的服务器和客户端具有可移植性。在网络上传输二进制数据并不是一个好主意。您可以创建自己的文本协议,或使用现有的协议(如Google Protocol Buffers)。

2
我没有给你点踩,但是我不同意你的答案。Protocol Buffers 是一种二进制协议。TCP 和 UDP 也是。 - wood_brian
我同意 G.P.B. 是一种二进制协议。我的意思是,我们需要使用像 QDataStream 或 G.P.B 这样严格定义的协议来发送数据,避免使用 reinterpret_cast 发送纯 C 二进制数据。 - DmitryARN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接