如何在Python中删除字符串s的前4个字节

1 投票
3 回答
18282 浏览
提问于 2025-04-18 06:44

我收到了一种特殊的数据包,它是字符串格式的,包含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)

撰写回答