用pythonic方法转储十六进制文件

2024-06-06 14:02:17 发布

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

我的问题很简单:

有没有办法用pythonic的方式编写bash命令?

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

显然,不使用操作系统、popen或任何快捷方式;)

编辑:虽然我没有显式地指定,但是如果代码在Python3.x中起作用,那就太好了

谢谢!


Tags: 代码命令bash编辑方式pythonichexdumppython3
3条回答

只需^{}整个文件和^{}。还有什么更像是Python?

with open('file.dat', 'rb') as f:
    hex_content = f.read().encode('hex')

如果您只关心Python 2.x,^{}将把二进制数据块编码为十六进制。所以:

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或其他值……。

如果两个参数{a2}看起来令人费解,请单击“帮助”链接;一旦你有了这个想法,它就不会太复杂了。

如果您关心Python 3.x,^{}只适用于将Unicode字符串转换为字节的编解码器;任何将Unicode字符串转换为字节的编解码器(或任何其他组合),则必须使用^{}来显式地执行此操作:

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

或者最好使用^{}

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

如果除了打印它们之外还想做些什么,而不是将整个文件读入内存,那么您可能需要创建一个迭代器。你可以把它放在一个函数中,把print改成yield,然后这个函数返回你想要的迭代器。或者使用genexpr或map调用:

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

标准图书馆是你的朋友。试试binascii.hexlify()

相关问题 更多 >