Десериализовать QByteArray в типы данных Java

В настоящее время я работаю над соединением клиент-сервер.

Клиент написан на Джава не используя QT на телефоне Android, сервер написан на C ++ с использованием Qt framework.

клиент получает QByteArrays , QStrings а также QLists, но я понятия не имею, как десериализовать и интерпретировать поступающие данные.

Исходный код C ++, который создает пакет, который я должен прочитать на стороне клиента Java, выглядит следующим образом:

QByteArray body;
QString string1, string2, string3;
QList<float> list;
qint8 recognitionCount;

QDataStream bodyStream(&body, QIODevice::WriteOnly);

bodyStream << recognitionCount;

bodyStream << string1.toUtf8()
<< string2.toUtf8()
<< string3.toUtf8()
<< list;

Связь между клиентом и сервером установлена ​​и работает нормально. Я понимаю, как читать целые числа, которые сервер отправляет мне, например. Я также знаю, как читать байты, но что мне делать с этими байтами? Как я могу отформатировать их, например, в строку?

Может кто-нибудь мне помочь?

Я действительно ценю любую помощь!

1

Решение

Вы можете конвертировать Qt Strings в Java следующим образом (согласно это определение):

final static int MAX_STRING_LENGTH = 10240; // arbitrary number
private final static ByteBuffer stringBytes = ByteBuffer.allocate(MAX_STRING_LENGTH);

static String readStringFromQTStream(final ObjectInputStream in) throws IOException {
if (in.available() < (Integer.SIZE / 8)) { // check that there are at least 4 bytes for the length
throw new IOException("Illegal data received: expected integer but only got " + in.available() + " bytes");
}
final int stringLength = in.readInt();
if (stringLength == 0xFFFFFFFF) { // Qt for null string
return null;
}
if ((stringLength < 0) || (stringLength > stringBytes.capacity())) { // check for malformed data
throw new IOException("Illegal data received: string with supposed length of " + stringLength + " bytes");
}

stringBytes.clear(); // global var, not thread-safe!
in.readFully(stringBytes.array(), 0, stringLength);
stringBytes.flip();
return StandardCharsets.UTF_8.decode(stringBytes).toString();
}

Обратите внимание, что ByteBuffer используется повторно, что является хорошим увеличением производительности, если вы часто читаете данные, но это, конечно, не является поточно-ориентированным без дополнительного кода.

2

Другие решения

Формат QDataStream зарегистрировано, например, в http://qt-project.org/doc/qt-4.8/datastreamformat.html. Это должно сказать вам, что вам нужно знать, чтобы десериализовать его для типов Java.

1

На вашем сервере вы должны знать, что клиент «спрашивает» и правильно отвечает.
На стороне клиента то же самое, вы должны понимать, что сервер «отвечает».
Таким образом, вы должны создать свой собственный «протокол» связи между вашим сервером и клиентом.

То, что обменивается через провод, это только последовательность байтов, а не QByteArray ни QList.

API QTcpSocket дает вам все, что вам нужно знать о подключенном клиенте (если предполагается, что приложение поддерживает более одного клиента, это ваше дело, и как записывать данные в сокет).

На стороне клиента будет почти то же самое, но я никогда не разрабатывал в Android, поэтому не могу ничего предложить.

Это мой ответ очень кратко объясняет, как собрать клиент-сервер приложения в Qt. Может быть, может быть полезным.

0

В случае, если кто-нибудь сталкивается с этой темой:

Я рекомендую использовать Буферы протокола вместо передачи данных по проводам.

0
По вопросам рекламы [email protected]