Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将QByteArray反序列化为Java数据类型_Java_C++_Qt_Deserialization_Qbytearray - Fatal编程技术网

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

将QByteArray反序列化为Java数据类型,java,c++,qt,deserialization,qbytearray,Java,C++,Qt,Deserialization,Qbytearray,我目前正在处理客户端-服务器连接 客户端是用 java >不使用Android手机上的QT,服务器用C++ >使用 Qt框架>/P> 客户端接收QbyteArray、QStrings和QLists,但我不知道如何反序列化和解释输入数据 < >创建在java客户端上必须读取的包的C++源代码看起来如下: QByteArray body; QString string1, string2, string3; QList<float> list; qint8 recognitionCou

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

<>客户端是用<强> java <强> >不使用Android手机上的QT,服务器用C++ >使用<强> Qt框架>/P> 客户端接收QbyteArrayQStringsQLists,但我不知道如何反序列化和解释输入数据

< >创建在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;
QByteArray主体;
QString string1、string2、string3;
QList列表;
qint8识别计数;
QDataStream bodyStream(&body,QIODevice::WriteOnly);

bodyStream在您的服务器上,您必须知道客户端的“询问”和正确回答。 同样,在客户端,您必须了解服务器的“答案”是什么。 因此,您必须在服务器和客户端之间创建自己的通信“协议”

通过导线交换的只是一个字节序列,而不是QByteArray或QList

QTcpSocket的API为您提供了所需的一切,以了解所连接的客户端(如果应用程序应支持多个客户端,则这是您的业务,以使其成为可能)以及如何写入套接字

在客户端几乎是一样的,但我从来没有在Android上开发过,所以不能提出任何建议


本文非常简要地解释了如何在Qt中构建应用程序客户机服务器。可能有用。

QDataStream的格式记录在,例如。这应该告诉您将其反序列化为Java类型所需的知识。

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

final static int MAX_STRING_LENGTH=10240;//任意数
私有最终静态ByteBuffer stringBytes=ByteBuffer.allocate(最大字符串长度);
静态字符串readStringFromQTStream(中的最终ObjectInputStream)引发IOException{
如果(in.available()<(Integer.SIZE/8)){//检查长度是否至少有4个字节
抛出新IOException(“接收到非法数据:预期为整数,但仅获取“+in.available()+”bytes”);
}
final int stringLength=in.readInt();
如果(stringLength==0xFFFFFF){//Qt表示空字符串
返回null;
}
如果((stringLength<0)| |(stringLength>stringBytes.capacity()){//检查格式错误的数据
抛出新IOException(“接收到非法数据:假定长度为“+stringLength+”字节的字符串”);
}
stringBytes.clear();//全局变量,不是线程安全的!
in.readFully(stringBytes.array(),0,stringLength);
stringBytes.flip();
返回StandardCharsets.UTF_8.decode(stringBytes.toString();
}

请注意,ByteBuffer是重复使用的,如果您经常读取数据,这是一个很好的性能提升,但是如果没有进一步的代码,这当然不是线程安全的。

如果有人遇到此线程:


我建议改为使用进行数据线传输。

如何通过线发送数据?TCP套接字和DataInputStream问题是如何序列化数据。QLead和QByteArray是类型,而不是协议/格式(我会考虑使用XML或JSON之类的东西,除非你真的需要二进制格式),所以如果你使用QTCPSCub和DATAN的话,你已经知道了客户端将接收什么,它不是QBytErRayor也不是QLIST!你必须做逆操作来建立你的数据编辑我的问题,并添加了C++代码来格式化数据包。我希望现在情况更清楚。不幸的是,我必须使用这种二进制格式,不能使用XML或JSON。您好,谢谢您的回答。我确实有一个协议,我知道这些网络概念。客户端和服务器之间的连接运行良好,例如,当服务器向我发送一个整数时,我没有任何问题,因为我知道它的大小,只需要从流中读取下一个整数。但是,当服务器向我发送QbyteArray之类的对象时,我不知道我应该读什么。我现在还没有使用QTcpSocket(我没有在服务器端工作过,我只知道协议)。在客户端,我将Java标准库用于套接字;为了避免线程安全问题,您可以在本地声明
stringBytes
。我不明白你为什么要从一个不安全的解决方案开始。过早优化?由于ThreadLocal的发明,可能没有理由不这样做(除了代码演示的简单性)。但是在函数内部本地声明它将导致巨大的创建开销,因为生成ByteBuffer比生成简单数组要昂贵得多。
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();
}