2011-12-13 2 views
1

У моей команды и я эта неприятная проблема с разбором строки, полученной с нашего сервера. Сервер довольно просто гнездо вещь сделана в Qt здесь функция SendData:Кодирование строки на стороне клиента 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

Это похоже на проблему с кодировкой. В полученной строке есть «секретное сообщение». В любом случае * используйте инструмент, например wirehark или tcpdump, чтобы посмотреть на данные по проводам, чтобы устранить необходимость угадывать * :) –

+0

рассмотрит эти инструменты сейчас, спасибо – okin33

+0

Ваш образец кода никогда не назначает блок. Предполагается, что он имеет блок = ответ.toUtf8()? – Thomas

ответ

3

На первый взгляд, линия, где вы преобразовать параметр QString в utf8 QByteArray, а затем обратно к QString кажется странным:

QString text = response.toUtf8(); 

Когда QByteArray возвращаемый toUtf8() присваивается text, я думаю, что это предполагается, что QByteArray содержит буфер Ascii (char*).

+0

Спасибо за помощь, мы решили проблему, это была действительно та линия. – okin33

+1

Когда мы конвертируем ответ в UTF8, мы пытались сохранить его в переменной типа QString, которая нарушила кодировку. Как только вы измените тип текстовой переменной на QByteArray, она будет работать. QByteArray text = response.toUtf8(); – okin33

1

Я уверен, что QDataStream предназначен для использования только внутри Qt. Он обеспечивает независимый от платформы способ сериализации данных, который затем предназначен для десериализации с другим QDataStream где-то в другом месте. Как вы заметили, это включает в себя множество дополнительных материалов, помимо ваших необработанных данных, и что дополнительный материал может быть изменен в следующей версии Qt. (Вот почему документация предлагает включить в ваш поток версию QDataStream, используемую ... поэтому она может использовать правильную логику десериализации.)

Другими словами, дополнительный материал, который вы видите, вероятно, включает метаданные по Qt, и не гарантируется то же самое со следующей версией Qt. Из документов:

двоичный формат QDataStream эволюционировала с Qt 1.0, и, вероятно, продолжать развиваться, чтобы отразить изменения, сделанные в Qt. При вводе или вывода сложных типов очень важно убедиться, что для чтения используется одна версия потока (версия()) и запись .

Если вы идете на другой язык, это нецелесообразно использовать. Если это только текст, который вы передаете, используйте известный транспортный механизм (JSON, XML, текст ASCII, UTF-8 и т. Д.) И вообще обходите QDataStream.

+0

Да, вы, вероятно, правы в том, что мы отправляем номер версии вместе со строкой, но мы удалили ее во время отладки для простоты. Мы попробуем использовать его для анализа данных мусора/метаданных перед строкой. – okin33

Смежные вопросы