Python轮子:base64~二进制数据转ASCII字符神器

原文链接: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编码需处理填充符号
  • 注意不同系统的换行符处理差异

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注