原文链接:http://www.juzicode.com/python-module-base64
base64是Python标准库中的二进制编码模块,可将任意二进制数据转换为ASCII字符。通过64个可打印字符(A-Za-z0-9+/)表示二进制数据,支持编解码操作。适用于在XML/JSON等文本协议中传输二进制内容,处理图片嵌入、简单数据加密等场景。提供URL安全变体,避免特殊字符冲突。
应用场景
- 网页图片Base64嵌入
- 电子邮件附件编码
- API二进制数据传输
- 简单数据混淆处理
- Cookie/Session存储
导入模块
# 无需安装,Python内置模块
import base64
使用方法
1. 基础编解码
演示字符串与Base64的相互转换。b64encode接收bytes类型数据,返回bytes结果需解码为字符串。注意处理编码前后的类型转换。
# juzicode.com/VX公众号:juzicode
import base64
text = "Hello, 桔子code!"
encoded = base64.b64encode(text.encode('utf-8'))
print("Encoded:", encoded.decode('utf-8'))
decoded = base64.b64decode(encoded)
print("Decoded:", decoded.decode('utf-8'))
运行结果:
Encoded: SGVsbG8sIOahlOWtkGNvZGUh
Decoded: Hello, 桔子code!
2. 图片转Base64
将图片文件编码为Base64字符串,适用于网页嵌入。读取二进制数据后编码,可添加Data URI前缀直接用于HTML。
# juzicode.com/VX公众号:juzicode
import base64
with open("logo.png", "rb") as f:
img_data = f.read()
b64_str = base64.b64encode(img_data).decode('utf-8')
html_code = f'<img src="data:image/png;base64,{b64_str[:30]}...">'
print(html_code)
运行结果:
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgA...">
3. URL安全编码
使用urlsafe_b64encode替换+/为-_,避免URL参数冲突。注意处理可能缺失的填充等号。
# juzicode.com/VX公众号:juzicode
import base64
data = b"\\x01\\x02\\xff\\xfe"
safe_encoded = base64.urlsafe_b64encode(data)
print("URL Safe:", safe_encoded.decode())
# 解码示例
decoded = base64.urlsafe_b64decode(safe_encoded)
print("Decoded:", decoded)
运行结果:
URL Safe: XHgwMVx4MDJceGZmXHhmZQ==
Decoded: b'\\x01\\x02\\xff\\xfe'
4. 自定义字符集编码
通过自定义编码表实现简单加密。此处将”+/”替换为”-_”,需保持编码表长度正确。
# juzicode.com/VX公众号:juzicode
import base64
custom_b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"
text = "SecretMessage"
std_encoded = base64.b64encode(text.encode()).decode()
# 替换标准字符集
custom_encoded = std_encoded.translate(str.maketrans("+/", "-_"))
print("Custom Encoded:", custom_encoded)
运行结果:
Custom Encoded: U2VjcmV0TWVzc2FnZQ==
5. 大文件分块编码
处理大文件时分段读取编码,避免内存溢出。每处理3字节二进制数据生成4字节Base64字符。
# juzicode.com/VX公众号:juzicode
import base64
def encode_large_file(file_path, chunk_size=1024):
b64_chunks = []
with open(file_path, "rb") as f:
while True:
chunk = f.read(chunk_size)
if not chunk:
break
b64_chunks.append(base64.b64encode(chunk))
return b"".join(b64_chunks)
encoded_data = encode_large_file("video.mp4")
print(f"Encoded size: {len(encoded_data)//1024}KB")
运行结果:
Encoded size: 1536KB
6. 数据签名编码
结合hashlib生成校验编码。先计算MD5哈希值,再与原始数据拼接后编码,用于完整性验证。
# juzicode.com/VX公众号:juzicode
import base64
import hashlib
def signed_encode(data):
md5 = hashlib.md5(data).digest()
signed = md5 + data
return base64.b64encode(signed)
# 验证示例
encoded = signed_encode(b"Important Data")
decoded = base64.b64decode(encoded)
check_md5, original = decoded[:16], decoded[16:]
print("Valid:", hashlib.md5(original).digest() == check_md5)
运行结果:
Valid: True
总结
base64模块核心功能:
- 二进制数据ASCII字符化
- 支持标准与URL安全编码
- 提供基础编解码方法
- 兼容bytes/str类型处理
注意事项:
- 编码后数据体积增加约33%
- 非加密用途,需敏感数据应使用加密算法
- URL编码需处理填充符号
- 注意不同系统的换行符处理差异