Python:将十六进制从文件读取到列表中?

问题描述 投票:0回答:3

有没有一种简单的方法,在Python中,将文件的十六进制数据读取到列表中,比如

hex

所以

hex
会是这样的:

hex = ['AA','CD','FF','0F']

我不想读入字符串,然后拆分。这对于大文件来说是内存密集型的。

python hex
3个回答
14
投票
s = "Hello"
hex_list = ["{:02x}".format(ord(c)) for c in s]

输出

['48', '65', '6c', '6c', '6f']

只需将

s
更改为
open(filename).read()
就可以了。

with open('/path/to/some/file', 'r') as fp:
    hex_list = ["{:02x}".format(ord(c)) for c in fp.read()]

或者,如果您不想将大文件的整个列表一次保存在内存中。

hex_list = ("{:02x}".format(ord(c)) for c in fp.read())

要获取值,请继续致电

next(hex_list)

从生成器获取所有剩余的值

list(hex_list)

9
投票

使用 Python 3,我们假设输入文件包含您显示的示例字节。例如我们可以这样创建

>>> inp = bytes((170,12*16+13,255,15)) # i.e. b'\xaa\xcd\xff\x0f'
>>> with open(filename,'wb') as f:
...     f.write(inp)

现在,鉴于我们想要输入文件中每个字节的十六进制表示,最好以二进制模式打开文件,而不尝试将其内容解释为字符/字符串(否则我们可能会遇到错误

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xaa in position 0: invalid start byte
)

>>> with open(filename,'rb') as f:
...     buff = f.read() # it reads the whole file into memory
...
>>> buff
b'\xaa\xcd\xff\x0f'
>>> out_hex = ['{:02X}'.format(b) for b in buff]
>>> out_hex
['AA', 'CD', 'FF', '0F']

如果文件很大,我们可能想一次读取一个字节或分块读取。为此,我建议阅读此问答


2
投票

请注意,为了查看文件的十六进制转储,大多数操作系统上都有可用的实用程序。如果您想做的只是十六进制转储文件,请考虑以下程序之一:

  • od
    (八进制转储,有
    -x
    -t x
    选项)
  • hexdump
  • xd
    Windows 下可用的实用程序
  • 在线十六进制转储工具,例如这个
© www.soinside.com 2019 - 2024. All rights reserved.