QDataStream readQString()如何读取utf8字符串



我正试图解码来自应用程序的UDP数据包数据,该应用程序使用Qt的QDataStream方法对数据进行编码,但在尝试解码字符串字段时遇到问题。医生说这些数据是用utf8编码的。python QDataStream模块只有一个readQString((方法。数字似乎解码得很好,但当第一个字符串解码不正确时,流指针就会出错。

如何解码这些UTF8字符串?

我正在使用源项目中的一些文档来解释编码:wsjtx2.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\x02\x00\x0\x00\x00\x00\x06WSJT-X\x00\x000\x00\x03\x00\x0\x00\x002.0\x00\x00/x00\x000\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)

长话短说,我正在读取的wsjtx-udp协议没有使用QDataString类型对字符串进行编码,因此期望I.readQString((可以工作是错误的。

相反,使用QInt32对数据进行编码,以定义字符串长度,然后是QByteArray中编码的UTF8字符。

我成功地将此功能封装在一个函数中:

def jt_decode_utf8_str(i(:"quot"字符串使用指示大小的int 32进行编码然后是长度大小为utf-8的字节数组:param i::return:解码字符串"quot"sz=i.readInt32((b=i.readRawData(sz(返回b.decode("utf-8"(

最新更新