Python元组数据字节串简单方式?

时间:2018-06-02 08:37:16

标签: python-3.x struct bytestream

我使用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")

有没有神奇的方法可以一次将字节转换为必需的字符串,因为字节的位置是已知的...... ??

1 个答案:

答案 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')