如何在Python中删除字符串s的前4个字节
我收到了一种特殊的数据包,它是字符串格式的,包含32个字节的头部,后面的内容有一个或多个条目,每个条目由90个字节组成。
我想用Python来处理这个字符串。我可以先读取前32个字节的头部,然后把它从字符串中去掉,再继续读取第一个条目的90个字节吗?
大概是这样的:
str.read(32) # => "x01x02..."
str.read(90) # => "x02x05..."
3 个回答
4
在Python 2.x中,你可以简单地这样做:
header = s[:32]
body = s[32:32+90]
而在Python 3.x中,所有的字符串都是Unicode格式,所以我会先把它转换成字节数组:
s = bytearray(s)
header = s[:32]
body = s[32:32+90]
5
要把数据包分成一个32字节的头部和主体:
header = packet[:32]
body = packet[32:]
接下来,要把主体进一步分成一个或多个条目:
entries = [packet[i:i+90] for i in range(0, len(packet), 90)]
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个字节),short(2个字节),int(4个字节)
。它还支持在格式字符串中指定字节顺序(即大端或小端)。
比如,如果你的头部格式是 uint, 4字节字符串, 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)