Клиентская строка, кодирующая Java - PullRequest
1 голос
/ 14 декабря 2011

Моя команда и я столкнулись с этой неприятной проблемой при разборе строки, полученной с нашего сервера.Сервер - это довольно простая штука сокетов, выполненная в qt, вот функция sendData:

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);
    }...

Если с сервером установлено соединение, он отправляет строку «Send Handshake» с размером строки в байтах, отправленных перед ним, как показано в первомблок кода.Это уведомляет клиента о том, что он должен отправить аутентификацию на сервер.На данный момент строка, которую мы получаем от сервера, выглядит следующим образом: ������ ��������S��e��n��d�� ��H��a��n�*D��s��h��a��k��e

Мы использовали такие инструменты, как инструмент кодирования / декодирования строк , чтобы попытаться оценить, как строка кодируется, ноон не работает в каждой конфигурации.

У нас нет идей относительно того, что это за кодировка, если таковая имеется, или как ее исправить.Любая помощь приветствуется.

Ответы [ 2 ]

3 голосов
/ 14 декабря 2011

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

QString text = response.toUtf8();

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

1 голос
/ 14 декабря 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...