如何从python中的s字符串中删除前4个字节

时间:2014-05-16 06:03:42

标签: python python-2.x

我得到了一个字符串格式的特殊数据包,它有32个字节的标题,正文包含一个或多个条目,每个条目包含90个字节。

我想使用python处理这个字符串。我可以像读取sock读取的第一个32字节标头,并将其从字符串中删除,并继续读取第一个条目的90个字节吗?

类似的东西:

str.read(32) # => "x01x02..."
str.read(90) # => "x02x05..."

3 个答案:

答案 0 :(得分:7)

您可以使用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)。它还支持在格式字符串中指定字节顺序(字节顺序)。

例如,如果您的标题格式为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)

答案 1 :(得分:5)

将数据包拆分为32字节的标题和正文:

header = packet[:32]
body = packet[32:]

进一步将身体分成一个或多个条目:

entries = [packet[i:i+90] for i in range(0, len(packet), 90)]

答案 2 :(得分:4)

在python 2.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]