`binascii` 是 Python 标准库中专用于二进制与各种 ASCII 编码格式之间转换的底层模块
### `binascii` 模块核心功能与用法详解
`binascii` 是 Python 标准库中专用于二进制与各种 ASCII 编码格式之间转换的底层模块,其函数全部操作 `bytes` 类型,不接受 `str`,且不进行自动编码/解码(如 UTF-8 转换),需由调用者显式处理字符串与字节的边界。该模块性能高、无依赖,适用于密码学预处理、协议解析、固件分析等场景。
---
### 常用函数分类与示例
#### 1. Hex 编解码(最常用)
`hexlify()` 将任意字节序列转为小写十六进制 ASCII 字符串(长度恒为原字节数 × 2);`unhexlify()` 执行严格逆操作,要求输入为偶数长度、仅含 `0-9a-fA-F` 的字符串,否则抛出 `binascii.Error`。
```python
import binascii
# 字符串 → bytes → hex
text = "Hello世界"
data = text.encode('utf-8') # b'Hello\xe4\xb8\x96\xe7\x95\x8c'
hex_str = binascii.hexlify(data).decode('ascii')
print(hex_str) # '48656c6c6fe4b896e7958c'
# hex → bytes → 字符串
restored_bytes = binascii.unhexlify(hex_str)
restored_text = restored_bytes.decode('utf-8')
print(restored_text) # 'Hello世界'
```
> 注意:`binascii.hexlify()` 返回 `bytes`,常需 `.decode('ascii')` 转为 `str`;而 `bytes.fromhex()`(内置 `bytes` 方法)可直接从 `str` 解析,语义更清晰。
#### 2. Base64 编解码(兼容性补充)
虽然 `base64` 模块是 Base64 操作首选,但 `binascii` 提供了 `b2a_base64()` 和 `a2b_base64()` 作为底层实现。二者默认行为与 `base64.b64encode()` 略有差异:`b2a_base64()` 默认在末尾添加换行符(`newline=True`),且返回 `bytes`;若需 URL 安全或无换行,应优先使用 `base64.urlsafe_b64encode()` 或显式控制参数。
```python
import binascii
data = b"Secret123"
# b2a_base64 默认带换行,需 strip()
encoded = binascii.b2a_base64(data, newline=False).decode('ascii')
print(encoded) # 'U2VjcmV0MTIz'
# a2b_base64 可直接解码(自动忽略空白字符)
decoded = binascii.a2b_base64(encoded.encode('ascii'))
print(decoded) # b'Secret123'
```
> `b2a_base64()` 参数 `padded=True` 表示保留 Base64 标准填充 `=`,不可省略;`wrapcol=0` 禁用自动折行。
#### 3. 其他 ASCII 编码(较少用但关键场景存在)
- `b2a_uu()` / `a2b_uu()`:UUencode 编解码(旧邮件协议)
- `b2a_hqx()` / `a2b_hqx()`:Macintosh BinHex 编解码
- `crc32()`:计算 CRC-32 校验值(返回有符号 int,需 `& 0xffffffff` 转为无符号)
```python
import binascii
# CRC32 示例(常用于校验固件/网络包)
payload = b"DATA"
crc = binascii.crc32(payload) & 0xffffffff
print(f"{crc:08x}") # 'd1aa5f77'
```
---
### 与 `base64` 模块的关键区别
| 特性 | `binascii` | `base64` |
|------|------------|----------|
| 主要定位 | 底层 C 实现,极简接口 | 高级封装,面向应用,支持流式、URL 安全、自定义字母表 |
| 输入/输出类型 | 全部为 `bytes` | `b64encode()` 返回 `bytes`,但提供 `b64encode(...).decode()` 便捷链式调用 |
| URL 安全支持 | ❌ 不支持 `-_` 替代 `+/` | ✅ `urlsafe_b64encode()` / `urlsafe_b64decode()` |
| 填充处理 | `a2b_base64()` 自动容忍缺失 `=`(宽松) | `b64decode()` 严格要求标准填充,否则报错 |
> 在密码学工程中(如 AES 密文传输),推荐使用 `base64.urlsafe_b64encode()` 避免 URL/JSON 中的特殊字符问题;而 `binascii` 更适合嵌入式日志解析、逆向分析中快速 hex dump 处理。
---
### 错误处理与最佳实践
所有 `binascii` 函数在输入非法时抛出 `binascii.Error`,必须捕获。常见错误包括:
- `unhexlify()` 输入含非十六进制字符或奇数长度;
- `a2b_base64()` 输入含非法 Base64 字符(如空格未被过滤);
- 对非 `bytes` 类型(如 `str`)直接传参(Python 3.12+ 已强制类型检查)。
```python
try:
invalid_hex = "123G" # G 不是合法 hex 字符
binascii.unhexlify(invalid_hex)
except binascii.Error as e:
print(f"Hex decode failed: {e}") # Hex decode failed: Non-hexadecimal digit found
```
> 所有明文、密钥、IV 必须为 `bytes` 类型;字符串必须通过 `.encode('utf-8')` 显式转换,编码选择影响字节长度(如中文在 UTF-8 下占 3 字节,在 GBK 下占 2 字节)。
---
相关推荐
Python 十六进制整数与ASCii编码字符串相互转换方法
在使用Pyserial与STM32进行通讯时,遇到了需要将十六进制整数以Ascii码编码的字符串进行发送并且将接收到的Ascii码编码的字符串转换成十六进制整型的问题。查阅网上的资料后,均没有符合要求的,遂结合各家之长,用了以下方法。 环境 Python2.7 + Binascii模块 十六进制整数转ASCii编码字符串 # -*- coding: utf-8 -*- import binascii #16进制整数转ASCii编码字符串 a = 0x665554 b = hex(a) #转换成相同的字符串即'0x665554' b = b[2:] #截取掉'0x' c = binascii
python binascii 进制转换实例
今天小编就为大家分享一篇python binascii 进制转换实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
主要介绍了Python 字节流,字符串,十六进制相互转换实例(binascii,bytes),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
二进制与文本互转工具
二进制与文本互转小工具(含示例)。支持windowsxp、windows7操作系统;支持字节、字、双字转换;支持大小端转换;python编写。
python标准库模块
多达200个python模块的使用说明,绝对是python编程不可缺少的。



