Я пытаюсь декодировать пакетные данные UDP из приложения, которое закодировало данные с помощью методов Qt QDataStream, но возникают проблемы при попытке декодирования строковых полей. В документах говорится, что данные были закодированы в utf8. Модуль python QDataStream имеет только метод readQString (). Кажется, что числа декодируются нормально, но указатель потока искажается, когда первые строки декодируются неправильно.
Как я могу декодировать эти строки UTF8?
Я использую некоторую документацию из исходного проекта интерпретации кодировка: wsjtx-2.2.2.tgz NetworkMessage.hpp Описание в файле заголовка
Header:
32-bit unsigned integer magic number 0xadbccbda
32-bit unsigned integer schema number
Есть статусное сообщение, например, с такими комментариями:
Heartbeat Out/In 0 quint32
Id (unique key) utf8
Maximum schema number quint32
version utf8
revision utf8
пример данных из сокета при получении сообщения о состоянии:
b '\ xad \ xbc \ xcb \ xda \ x00 \ x00 \ x00 \ x02 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x06WSJT -X \ x00 \ x00 \ x00 \ x03 \ x00 \ x00 \ x00 \ x052.1.0 \ x00 \ x00 \ x00 \ x0624fcd1 '
def jt_decode_heart_beat(i):
"""
Heartbeat Out/In 0 quint32
Id (unique key) utf8
Maximum schema number quint32
version utf8
revision utf8
:param i: QDataStream
:return: JT_HB_ID,JT_HB_SCHEMA,JT_HB_VERSION,JT_HB_REVISION
"""
JT_HB_ID = i.readQString()
JT_HB_SCHEMA = i.readInt32()
JT_HB_VERSION = i.readQString()
JT_HB_REVISION = i.readQString()
print(f"HB:ID={JT_HB_ID} JT_HB_SCHEMA={JT_HB_SCHEMA} JT_HB_VERSION={JT_HB_VERSION} JT_HB_REVISION={JT_HB_REVISION}")
return (JT_HB_ID, JT_HB_SCHEMA, JT_HB_VERSION, JT_HB_REVISION)
while 1:
data, addr = s.recvfrom(1024)
b = QByteArray(data)
i = QDataStream(b)
JT_QT_MAGIC_NUMBER = i.readInt32()
JT_QT_SCHEMA_NUMBER = i.readInt32()
JT_TYPE = i.readInt32()
if JT_TYPE == 0:
# Heart Beat
jt_decode_heart_beat(i)
elif JT_TYPE == 1:
jt_decode_status(i)