从二进制文件读取字符串
我想从一个文件中读取第1、2和3个字节。我知道这对应于一个字符串(在这个例子中是Linux二进制文件头的ELF
)。
根据我在网上找到的一些例子,我写出了这个代码:
with open('hello', 'rb') as f:
f.seek(1)
bytes = f.read(3)
string = struct.unpack('s', bytes)
print st
查看官方文档,发现传入s
作为参数应该可以让我读取一个字符串。
但是我遇到了这个错误:
st = struct.unpack('s', bytes)
struct.error: unpack requires a string argument of length 1
编辑:我使用的是Python 2.7
2 个回答
3
在Python 2中,read
这个函数会返回一个字符串,这里的字符串其实是“字节串”。如果你想获取一个单独的字节,可以用bytes[i]
,这样会返回一个新的字符串,但里面只有一个字节。如果你需要这个字节的数字值,可以使用ord
函数,比如ord(bytes[i])
。最后,如果你想获取所有字节的数字值,可以用map(ord, bytes)
。
In [4]: s = "foo"
In [5]: s[0]
Out[5]: 'f'
In [6]: ord(s[0])
Out[6]: 102
In [7]: map(ord, s)
Out[7]: [102, 111, 111]
4
在你的特殊情况下,只需要检查一下
if bytes == 'ELF':
就可以一步测试这三个字节,看看它们是否是字符 E
、L
和 F
。
如果你还想检查这些字节的数值,其实也不需要拆开任何东西。只需使用 ord(bytes[i])
(其中 i 是 0、1、2)就能得到这三个字节的数值。
另外,你也可以使用
byte_values = struct.unpack('bbb', bytes)
来获取这三个字节的元组。如果这些字节有可命名的含义,你也可以直接拆解这个元组,像这样:
width, height, depth = struct.unpack('bbb', bytes)
如果你的字节值应该是无符号的,可以用 'BBB'
替代 'bbb'
。