Pythonic 方法来十六进制转储文件

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

有没有办法以 Python 方式编码这个 Bash 命令?

hexdump -e '2/1 "%02x"' file.dat

显然,不使用

os.popen
或任何此类快捷方式;)

如果代码能在 Python3.x 中运行那就太好了

python python-3.x hexdump
3个回答
16
投票

标准库是你的朋友。 尝试 binascii.hexlify()


14
投票

如果您只关心Python 2.x,

line.encode('hex')
会将一大块二进制数据编码为十六进制。所以:

with open('file.dat', 'rb') as f:
    for chunk in iter(lambda: f.read(32), b''):
        print chunk.encode('hex')

(IIRC,

hexdump
默认每行打印 32 对十六进制;如果没有,只需将
32
更改为
16
或其他任何名称...)

如果两个参数

iter
看起来令人困惑,请单击帮助链接;一旦你明白了,它就不会太复杂。

如果您关心 Python 3.x,

encode
仅适用于将 Unicode 字符串转换为字节的编解码器;任何以相反方式转换(或任何其他组合)的编解码器,您必须使用
codecs.encode
显式地执行此操作:

with open('file.dat', 'rb') as f:
    for chunk in iter(lambda: f.read(32), b''):
        print(codecs.encode(chunk, 'hex'))

或者使用

hexlify
可能会更好:

with open('file.dat', 'rb') as f:
    for chunk in iter(lambda: f.read(32), b''):
        print(binascii.hexlify(chunk))

如果您除了打印出来之外还想做一些事情,而不是将整个文件读入内存,您可能需要创建一个迭代器。您可以将其放入一个函数中,并将

print
更改为
yield
,该函数将准确返回您想要的迭代器。或者使用geneexpr或
map
调用:

with open('file.dat', 'rb') as f:
    chunks = iter(lambda: f.read(32), b'')
    hexlines = map(binascii.hexlify, chunks)

5
投票

只需

read()
整个文件和
encode('hex')
。还有什么比这更Pythonic 的吗?

with open('file.dat', 'rb') as f:
    hex_content = f.read().encode('hex')
© www.soinside.com 2019 - 2024. All rights reserved.