从二进制文件读取字符串

时间:2014-05-02 08:43:15

标签: python string python-2.7 binary

我想从文件中读取字节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

查看struct的官方文档,似乎将s作为参数传递应该允许我读取字符串。

我收到错误:

st = struct.unpack('s', bytes)
struct.error: unpack requires a string argument of length 1

编辑:使用Python 2.7

2 个答案:

答案 0 :(得分:2)

在您的特殊情况下,只需检查

即可
if bytes == 'ELF':

一步测试所有三个字节为三个字符ELF

但是如果你想检查数值,你也不需要在这里打开任何东西。只需使用ord(bytes[i])(在0,1,2中使用i)来获取三个字节的字节值。

或者你可以使用

byte_values = struct.unpack('bbb', bytes)

获取三个字节的元组。你也可以动态解包那个元组,以防这些字节具有如下的可命名语义:

width, height, depth = struct.unpack('bbb', bytes)

如果您的字节值无符号,请使用'BBB'代替'bbb'

答案 1 :(得分:2)

在Python 2中,read返回一个字符串;在“字符串”的意义上。要获得单个字节,请使用bytes[i],它将返回另一个字符串,但只有一个字节。如果您需要字节的数值,请使用ordord(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]