java - 将 QByteArray 反序列化为 Java 数据类型

标签 java c++ qt deserialization qbytearray

我目前正在处理客户端-服务器连接。

客户端是用Java编写的,而不是使用在Android手机上运行的QT,服务器是使用Qt框架用C++编写的。

客户端收到 QByteArraysQStringsQLists,但我不知道如何反序列化和解释传入的数据。

创建我必须在 java 客户端读取的数据包的 C++ 源代码如下所示:

QByteArray body;
QString string1, string2, string3;
QList<float> list;
qint8 recognitionCount;

QDataStream bodyStream(&body, QIODevice::WriteOnly);

bodyStream << recognitionCount;

bodyStream << string1.toUtf8()
<< string2.toUtf8()
<< string3.toUtf8()
<< list;

客户端和服务器之间的连接已建立并运行良好。例如,我了解如何读取服务器发送给我的整数。我也知道如何读取字节,但是我应该如何处理这些字节呢?例如,如何将它们格式化为字符串?

谁能帮帮我吗?

我真的很感谢任何帮助!

最佳答案

您可以像这样从 Qt 字符串转换为 Java(根据 this definition ):

final static int MAX_STRING_LENGTH = 10240; // arbitrary number
private final static ByteBuffer stringBytes = ByteBuffer.allocate(MAX_STRING_LENGTH);

static String readStringFromQTStream(final ObjectInputStream in) throws IOException {
  if (in.available() < (Integer.SIZE / 8)) { // check that there are at least 4 bytes for the length
    throw new IOException("Illegal data received: expected integer but only got " + in.available() + " bytes");
  }
  final int stringLength = in.readInt();
  if (stringLength == 0xFFFFFFFF) { // Qt for null string
    return null;
  }
  if ((stringLength < 0) || (stringLength > stringBytes.capacity())) { // check for malformed data
    throw new IOException("Illegal data received: string with supposed length of " + stringLength + " bytes");
  }

  stringBytes.clear(); // global var, not thread-safe!
  in.readFully(stringBytes.array(), 0, stringLength);
  stringBytes.flip();
  return StandardCharsets.UTF_8.decode(stringBytes).toString();
}

请注意,ByteBuffer 被重用,如果您频繁读取数据,这会带来很好的性能提升,但如果没有进一步的代码,这当然不是线程安全的。

关于java - 将 QByteArray 反序列化为 Java 数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19966583/

相关文章:

java - 尽管在使用 RepositoryRestConfiguration.disableDefaultExposure() 时公开了所有方法,但 405 方法不允许

c++ - 有没有办法提示用户使用什么数据类型作为模板 C++

qt - Autodesk Maya 模型面板调整大小事件

c++ - 快速检查 C++ 中的递增/递减运算符

c++ - QThread::wait() 和 QThread::finished()

c++ - 在同一个文件中实现多个窗口的功能?

java - 如何从标题中读取表单数据

java - Spark Dataframe 到 Java 类的 Dataset

java - 如何更改 Adob​​e AEM 中 Runnable 类的权限?

c++ - 重叠的字符串