2011-12-13 72 views
1

我的团队和我解析从我们的服务器收到的字符串有这个讨厌的问题。该服务器是很简单的插座东西在QT做这里的发送数据功能:客户端字符串编码java

void sendData(QTcpSocket *client,QString response){ 
QString text = response.toUtf8(); 
QByteArray block; 
QDataStream out(&block, QIODevice::WriteOnly); 
out << (quint32)0; 
out << text; 
out.device()->seek(0); 
out << (quint32)(block.size() - sizeof(quint32)); 
try{ 
    client->write(block); 
} 
catch(...){... 

客户是在Java中,也是相当标准的插座的东西,这里就是我们现在所在的尝试许多不同的方式后,如果连接与它发送一个字符串“发送握手”以字符串的在如在第一个代码块看到之前发送的字节大小的服务器取得

Socket s; 
try { 
    s = new Socket(URL, 1987); 

    PrintWriter output = new PrintWriter(s.getOutputStream(), true); 
    InputStreamReader inp = new InputStreamReader(s.getInputStream(), Charset.forName("UTF-8")); 
    BufferedReader rd = new BufferedReader(inp); 

    String st; 
    while ((st = rd.readLine()) != null){ 
     System.out.println(st); 
    }... 

:解码来自服务器的响应。这通知客户端它应该向服务器发送认证。截至目前,我们从服务器获得的字符串如下所示: S e n d H a n d s h a k e

我们已经使用诸如string encode/decode tool之类的工具来尝试和评估字符串是如何编码的,但是它在每个配置上都失败了。

我们不知道这是什么编码,如果有的话,或者如何解决它。 任何帮助将不胜感激。

+0

它看起来像一个编码问题。收到的字符串中有一个“秘密消息”。无论如何,*使用像wireshark或tcpdump这样的工具来查看线上数据以消除猜测* :) – 2011-12-13 21:41:28

+0

将现在查看这些工具,谢谢 – okin33 2011-12-13 21:47:13

+0

您的代码示例从不分配块。它应该有block =响应。toUtf8()? – Thomas 2011-12-13 21:53:26

回答

3

一目了然,在这里你将QString参数转换为UTF8 QByteArray,然后回到QString行似乎很奇怪:

QString text = response.toUtf8(); 

toUtf8()返回QByteArray被分配到text,我认为这假定QByteArray包含一个Ascii (char*)缓冲区。

1

我很确定QDataStream只能在Qt中使用。它提供了一种与平台无关的序列化数据的方式,然后打算将其他地方的另一个QDataStream进行反序列化。正如你注意到的那样,除了你的原始数据之外,它还包括了很多额外的东西,而且额外的东西在下一个Qt版本中可能会发生变化。 (这就是为什么文档建议在你的流中包含QDataStream版本的原因......所以它可以使用正确的反序列化逻辑。)

换句话说,你看到的额外东西可能是元数据而Qt的版本并不能保证与其相同。从文档:

QDataStream的二进制格式已经从Qt 1.0开始发展,并且很可能会继续发展以反映在Qt中完成的更改。当输入或输出复杂类型时,确保使用相同版本的流(版本())进行读取和写入 是非常重要的。

如果你要使用另一种语言,这是不实用的。如果它只是您传递的文本,请使用众所周知的传输机制(JSON,XML,ASCII文本,UTF-8等)并绕过QDataStream

相关问题