如何从 QByteArray 获取结构

Posted

技术标签:

【中文标题】如何从 QByteArray 获取结构【英文标题】:how to get structure from QByteArray 【发布时间】:2014-07-16 15:04:40 【问题描述】:

我有一个 C# 中的 TCP 通信应用程序和其他在 linux 上的 C++ Qt 程序

但在通信后,我从 C++ QByteArray 中的 C# 应用程序获取数据。 现在需要将 QByteArray 转换回 struct

如何在 QT 的 my_struct 中获取数据。 我用过

QDataStream in(&data, QIODevice::ReadOnly);
int parID;
QString parMessage;
in >> parID >>parMessage;

const my_struct* my_struct = reinterpret_cast<const my_struct* >(data.constData());
// display
qDebug() << " id :"<<my_struct->id<< " msg: "<< my_struct->msg;



struct my_struct

  int id;
  string msg;

【问题讨论】:

【参考方案1】:

QDataStream 使用自己的序列化/反序列化格式。看起来您的数据没有使用 QDataStream 序列化。要解决这个问题,您可以在 json/xml/etc 中发送数据。

【讨论】:

这不太正确。 QDataStream 当然使用它自己的简单格式来处理复杂的 Qt 数据类型。对于简单的类型,例如数值类型,实际上没什么大不了的:您选择字节顺序就可以了。【参考方案2】:

这取决于它是如何发送的。您需要确定双方的格式才能正确沟通。

发送字符串很棘手,你最好的办法是发送字符串的长度(作为 32 位未指定的 int),然后发送数据(以 utf8 格式),当你阅读时,你可以这样做

char* s;
int length;
in.readData(s, length);
QString str = QString::fromUtf8(s, length);
delete[] s;//free the allocated buffer

【讨论】:

以上是关于如何从 QByteArray 获取结构的主要内容,如果未能解决你的问题,请参考以下文章

关于QT C++ 在debug 模式和Release模式下对QByteArray赋值的差异化实践记录

从 QByteArray 以 bigendian 格式获取浮点数组的有效方法

如何把十六进制数存在qbytearray

从 QByteArray 解析 QT5 JSON

如何从数据库文件中创建 QByteArray

QByteArray储存二进制数据(包括结构体,自定义QT对象)