pythonic方式到十六进制转储文件

时间:2014-07-28 22:42:33

标签: python hexdump

我的问题很简单:

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

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

显然,不使用os,popen或任何快捷方式;)

编辑:虽然我没有明确指定,如果代码在Python3.x中正常运行会很棒

谢谢!

3 个答案:

答案 0 :(得分:10)

如果您只关心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,该函数将返回您想要的迭代器。或者使用genexpr或map电话:

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

答案 1 :(得分:9)

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

答案 2 :(得分:6)

只需read()整个文件和encode('hex')。什么可能更pythonic?

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