2011-12-13 113 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

相關問題