6

我的问题很简单:

有没有办法以 bash 命令的 Python 方式进行编码?

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

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

编辑:虽然我没有明确指定,但如果代码在 Python3.x 中可以正常工作,那就太好了

谢谢!

4

3 回答 3

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 对十六进制;如果没有,只需将其更改3216或其他任何内容……)

如果两个参数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为 a yield,并且该函数会返回您想要的迭代器。或使用genexpr 或map调用:

with open('file.dat', 'rb') as f:
    chunks = iter(lambda: f.read(32), b'')
    hexlines = map(binascii.hexlify, chunks)
于 2014-07-28T23:25:21.680 回答
12

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

于 2014-07-28T22:58:45.557 回答
5

只需read()整个文件和encode('hex'). 还有什么比 Pythonic 更好的呢?

with open('file.dat', 'rb') as f:
    hex_content = f.read().encode('hex')
于 2014-07-28T22:57:24.993 回答