pythonic way to hex dump files

2019-04-10 08:57发布

my question is simple:

Is there any way to code in a pythonic way that bash command?

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

Obviously, without using os, popen, or any shortcut ;)

EDIT: although I've not explicitly specified, it would be great if the code was functional in Python3.x

Thanks!

3条回答
Juvenile、少年°
2楼-- · 2019-04-10 09:16

If you only care about Python 2.x, line.encode('hex') will encode a chunk of binary data into hex. So:

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

(IIRC, hexdump by default prints 32 pairs of hex per line; if not, just change that 32 to 16 or whatever it is…)

If the two-argument iter looks baffling, click the help link; it's not too complicated once you get the idea.

If you care about Python 3.x, encode only works for codecs that convert Unicode strings to bytes; any codecs that convert the other way around (or any other combination), you have to use codecs.encode to do it explicitly:

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

Or it may be better to use hexlify:

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

If you want to do something besides print them out, rather than read the whole file into memory, you probably want to make an iterator. You could just put this in a function and change that print to a yield, and that function returns exactly the iterator you want. Or use a genexpr or map call:

with open('file.dat', 'rb') as f:
    chunks = iter(lambda: f.read(32), b'')
    hexlines = map(binascii.hexlify, chunks)
查看更多
Animai°情兽
3楼-- · 2019-04-10 09:19

Simply read() the whole file and encode('hex'). What could be more pythonic?

with open('file.dat', 'rb') as f:
    hex_content = f.read().encode('hex')
查看更多
Rolldiameter
4楼-- · 2019-04-10 09:34

The standard library is your friend. Try binascii.hexlify().

查看更多
登录 后发表回答