Skip to the content.

binascii — binary ↔ ASCII conversions

import binascii

Hex, base64, CRC32. Useful for encoding binary blobs to put in config files, hashing for cache keys, or sanity-checking downloads.

Hex

binascii.hexlify(data, sep=None)bytes

binascii.hexlify(b'\x00\x01\xff')          # b'0001ff'
binascii.hexlify(b'\x00\x01\xff', '-')     # b'00-01-ff'

binascii.unhexlify(s)bytes

binascii.unhexlify(b'0001ff')              # b'\x00\x01\xff'

Methods on bytes themselves

bytes.hex() and bytes.fromhex() do the same thing:

b'\x00\x01\xff'.hex()                      # '0001ff'
bytes.fromhex('0001ff')                    # b'\x00\x01\xff'

Base64

binascii.b2a_base64(data, *, newline=True)bytes

binascii.b2a_base64(b'hello')              # b'aGVsbG8=\n'
binascii.b2a_base64(b'hello', newline=False)  # b'aGVsbG8='

binascii.a2b_base64(s)bytes

binascii.a2b_base64(b'aGVsbG8=')           # b'hello'

CRC32

binascii.crc32(data, init=0)int

Standard CRC-32 (ISO 3309 polynomial, same one ZIP uses):

binascii.crc32(b'hello')                   # 907060870
hex(binascii.crc32(b'hello'))              # '0x3610a686'

Chunked CRC — pass the previous result as init:

crc = 0
with open('FILE.TXT', 'rb') as f:
    while True:
        chunk = f.read(4096)
        if not chunk: break
        crc = binascii.crc32(chunk, crc)
print('crc:', hex(crc))

Example: hex-dump

def hexdump(data, width=16):
    for i in range(0, len(data), width):
        chunk = data[i:i+width]
        h = binascii.hexlify(chunk, ' ').decode()
        t = ''.join(chr(b) if 32 <= b < 127 else '.' for b in chunk)
        print(f'{i:08x}  {h:<48}  {t}')

with open('MP.EXE', 'rb') as f:
    hexdump(f.read(64))

Credit: MicroPython binascii docs (MIT).