2024-09-23 22:25:44 发布
网友
我得到了一个字符串格式的特殊数据包,它有32字节的头,主体包含多个条目中的一个,每个条目由90字节组成。
我想用python处理这个字符串。我是否可以像sock read first 32 bytes header那样读取,并将其从字符串中去掉,然后继续读取第一个条目的90 bytes?
类似于:
str.read(32) # => "x01x02..." str.read(90) # => "x02x05..."
您可以使用StringIO像读取文件一样读取字符串
>>> import StringIO >>> s = 'Hello, World!' >>> sio = StringIO.StringIO(s) >>> sio.read(6) 'Hello,' >>> sio.read() ' World!'
我还建议您查看struct模块,以获得解析二进制数据的帮助
>>> from struct import * >>> pack('hhl', 1, 2, 3) '\x00\x01\x00\x02\x00\x00\x00\x03' >>> unpack('hhl', '\x00\x01\x00\x02\x00\x00\x00\x03') (1, 2, 3)
您可以使用格式字符串定义数据的格式,因此上例中的'hhl'是short (2 bytes), short (2 bytes), int (4 bytes)。它还支持在格式字符串中指定endianness(字节顺序)。
'hhl'
short (2 bytes), short (2 bytes), int (4 bytes)
例如,如果头格式是uint, 4 byte str, uint, uint, ushort, ulong:
uint, 4 byte str, uint, uint, ushort, ulong
>>> import struct >>> data = ''.join(chr(i) for i in range(128)) * 10 >>> hdr_fmt = 'I4sIIHL' >>> struct.calcsize(hdr_fmt) 32 >>> struct.unpack_from(hdr_fmt, data, 0) (50462976, '\x04\x05\x06\x07', 185207048, 252579084, 4368, 2242261671028070680)
要将数据包拆分为32字节的头和正文,请执行以下操作:
header = packet[:32] body = packet[32:]
要将正文进一步拆分为一个或多个条目,请执行以下操作:
entries = [packet[i:i+90] for i in range(0, len(packet), 90)]
在Python2.x中,您可以简单地执行以下操作:
header = s[:32] body = s[32:32+90]
在python 3.x中,所有字符串都是unicode,因此我将首先转换为bytearray:
s = bytearray(s) header = s[:32] body = s[32:32+90]
您可以使用StringIO像读取文件一样读取字符串
我还建议您查看struct模块,以获得解析二进制数据的帮助
您可以使用格式字符串定义数据的格式,因此上例中的
'hhl'
是short (2 bytes), short (2 bytes), int (4 bytes)
。它还支持在格式字符串中指定endianness(字节顺序)。例如,如果头格式是
uint, 4 byte str, uint, uint, ushort, ulong
:要将数据包拆分为32字节的头和正文,请执行以下操作:
要将正文进一步拆分为一个或多个条目,请执行以下操作:
在Python2.x中,您可以简单地执行以下操作:
在python 3.x中,所有字符串都是unicode,因此我将首先转换为bytearray:
相关问题 更多 >
编程相关推荐