Skip to main content

Modules/binascii.c (part 3)

Source:

cpython 3.14 @ ab2d84fe1023/Modules/binascii.c

This annotation covers CRC and legacy encoding functions. See modules_binascii2_detail for base64 encoding, a2b_base64, b2a_base64, and the lookup table approach.

Map

LinesSymbolRole
1-80binascii.hexlify / unhexlifyConvert bytes to/from hex string
81-180binascii.b2a_uu / a2b_uuUnix-to-Unix encoding (uuencode format)
181-280binascii.crc_hqxCRC-CCITT used by BinHex
281-400binascii.crc32PKZIP/zlib CRC-32

Reading

binascii.hexlify

// CPython: Modules/binascii.c:480 binascii_hexlify_impl
static PyObject *
binascii_hexlify_impl(PyObject *module, Py_buffer *data,
PyObject *sep, int bytes_per_sep)
{
/* Convert each byte to two hex chars.
Same implementation as bytes.hex() — delegates to _Py_strhex_with_sep. */
return _Py_strhex_with_sep((const char *)data->buf, data->len,
sep, bytes_per_sep);
}

binascii.hexlify(b'\xde\xad') returns b'dead' (bytes, not str). binascii.unhexlify('deadbeef') is the inverse. Note that bytes.hex() returns a str; hexlify returns bytes.

binascii.crc32

// CPython: Modules/binascii.c:880 binascii_crc32_impl
static PyObject *
binascii_crc32_impl(PyObject *module, Py_buffer *data, unsigned int crc)
{
/* Compute CRC-32 checksum.
Same polynomial as PKZIP, gzip, and zlib.crc32.
The result is unsigned in Python (masked to 32 bits). */
unsigned int result = crc32(crc ^ 0xFFFFFFFF,
(const Bytef *)data->buf, data->len);
result ^= 0xFFFFFFFF;
return PyLong_FromUnsignedLong(result);
}

binascii.crc32(b'hello') returns 907060870. The initial XOR with 0xFFFFFFFF implements the standard CRC-32 computation (pre/post complement). zlib.crc32 uses the same algorithm.

binascii.crc_hqx

// CPython: Modules/binascii.c:820 binascii_crc_hqx_impl
static PyObject *
binascii_crc_hqx_impl(PyObject *module, Py_buffer *data, unsigned int crc)
{
/* CRC-CCITT: polynomial 0x1021, used by the BinHex 4.0 format.
Table-driven: 256-entry lookup table precomputed at module init. */
unsigned char *bin_data = data->buf;
for (Py_ssize_t len = data->len; len-- > 0; ) {
crc = ((crc << 8) & 0xFF00) ^ crctab_hqx[(crc >> 8) ^ *bin_data++];
}
return PyLong_FromUnsignedLong(crc);
}

crc_hqx is used by binhex.binhex() and binhex.hexbin(). The BinHex format was used for Macintosh file transfers before the internet became ubiquitous.

gopy notes

binascii.hexlify is module/binascii.Hexlify in module/binascii/module.go. It uses hex.EncodeToString. binascii.crc32 uses Go's hash/crc32.ChecksumIEEE. binascii.crc_hqx uses a precomputed 256-element table. a2b_uu/b2a_uu implement the UU encoding algorithm.