如果你只关心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')
(如果我没记错,默认情况下,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)
2/1 "%02x"
是什么意思? - anatoly techtonik2/1
呢?对于那些了解 Python,但不熟悉 hexfump cli 的人来说,这个问题会更清晰明了。 - anatoly techtonik