我使用socket,struct通过tcp / ip协议接收和解压收到的字节消息,我得到了包含数字数据的元组以及按照合同定义的顺序的字节。 示例数据如下......
实施例: 从tcp ip
接收缓冲区数据buffer = sock.recv(61)
将字节解压缩为预定义的结构格式
tup_data = struct.unpack("<lll8s17sh22s", buffer)
tup_data
(61,12000,4000,b'msg\x00\x00\x00\x00\x00',b'anther
msg\x00\x00\x00\x00\x00\x00\x00',4,b'yet another
msg\x00\x00\x00\x00\x00\x00\x00')
由于数据是高流媒体的,执行时间很重要......我不想通过使用任何循环和isinstance()方法加载cpu。 由于字节的位置已定义,因此我目前正在使用
processed_data = (*tup_data[:3],
tup_data[3].strip(b"\x00").decode(),
tup_data[4].strip(b"\x00").decode(),
tup_data[5],
tup_data[6].strip(b"\x00").decode())
processed_data
(61,12000,4000,"msg","anther msg",4,"yet another msg")
有没有神奇的方法可以一次将字节转换为必需的字符串,因为字节的位置是已知的...... ??
答案 0 :(得分:0)
由于您正在使用struct.unpack
来解压缩缓冲区,并且由于format-characters
图表,您无法获得字符串格式作为输出。因此,您应该在源处删除额外的\x00
,或者只使用生成器理解,如下所示重新格式化作为字节实例的项目。
In [12]: tuple(i.strip(b'\x00').decode() if isinstance(i, bytes) else i for i in t)
Out[12]: (61, 12000, 4000, 'msg', 'anther msg', 4, 'yet another msg')