2011-12-13 14 views
1

私のチームと、私たちのサーバーから受け取った文字列を解析するのに厄介な問題があります。サーバーは、ここではQTで行われ、かなりシンプルなソケットのものであるのsendData関数です:クライアントはJavaであり、また、かなり標準ソケットのものであるクライアント側の文字列エンコーディング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(...){... 

我々は、多くのさまざまな方法を試した後、今である場合には、ここにあります接続は、それが文字列コードの最初のブロックに見られるように、その前に送信されたバイト数の文字列のサイズで「ハンドシェイクを送信」を送信するサーバとなる場合

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のようなツールを使ってデータを見て、推測する必要性を排除してください:) –

+0

はこれらのツールを今見ています。 – okin33

+0

コードサンプルは決してブロックを割り当てません。それはブロック=応答を持つことになっていますか?toUtf8()? – Thomas

答えて

3

、あなたがQStringに戻って、その後UTF8 QByteArrayQStringパラメータを変換し、ラインが奇妙に思える:toUtf8()によって返さQByteArraytextに割り当てられている

QString text = response.toUtf8(); 

、私はそれを考えますQByteArrayにAscii (char*)バッファーが含まれていると仮定しています。

+0

私たちが問題を解決したことを助けてくれてありがとう、本当にその行でした。 – okin33

+1

レスポンスをUTF8に変換すると、QString型の変数に格納しようとしましたが、これはエンコーディングを壊しました。テキスト変数の型をQByteArrayに変更すると、それが動作します。 QByteArray text = response.toUtf8(); – okin33

1

QDataStreamはQt内でのみ使用されることを確信しています。これは、他の場所で別のサーバでデシリアライズすることを目的とした、プラットフォームに依存しないデータのシリアライズ方法を提供します。あなたが気づいたように、それはあなたの生のデータの外にたくさんの余分なものを含んでいます、そして、余分なものは次のQtバージョンで変更されるかもしれません。 (QDataStreamのバージョンがストリームに含まれていることがドキュメントに示されているので、正しいデシリアライゼーションロジックを使用することができます)

つまり、余分なものはおそらくメタデータが含まれていますQtでは、次のQtバージョンと同じであることは保証されません。ドキュメントから:

QDataStreamのバイナリフォーマットは、Qtの1.0以来、進化、および にQtの中で行われた変更を反映するために進化し続ける可能性がありました。 複合型を出力する場合は、同じバージョンのストリーム(version())を読み込みに使用し、 を書き込むことを確認することが非常に重要です。

他の言語に行っている場合は、これは実用的ではありません。渡すテキストだけの場合は、よく知られたトランスポートメカニズム(JSON、XML、ASCIIテキスト、UTF-8など)を使用し、QDataStreamをバイパスします。

+0

はい、おそらく、バージョン番号を文字列と共に送信するのは間違いありませんが、単純化のためにデバッグ中に削除しました。文字列の先頭にあるジャンク/メタデータを解析するために使用します。 – okin33

関連する問題