我正在尝试从使用 Qt 的 QDataStream 方法对数据进行编码的应用程序中解码 UDP 数据包数据,但在尝试解码字符串字段时遇到问题。文档说数据是用 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)