从二进制fi读取字符串

2024-05-14 12:02:31 发布

您现在位置:Python中文网/ 问答频道 /正文

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

编辑:使用Python2.7


Tags: 字符串hellostring字节byteslinuxwith二进制
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]

在你的特殊情况下,只要检查一下就够了

if bytes == 'ELF':

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

但是如果你想检查数值,你不需要在这里打开任何东西。只需使用ord(bytes[i])(i为0,1,2)就可以得到三个字节的字节值。

或者你可以使用

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

得到三个字节的元组。如果字节具有如下可命名语义,也可以动态解压缩该元组:

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

使用'BBB'而不是'bbb',以防字节值无符号。

相关问题 更多 >

    热门问题