首先, 明确base64并不是一个压缩算法. 但是在某些场景我们可以使用其编码特性达到压缩的效果.
如下demo展示的一种应用场景:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
import base64
import json
origin_data = {
"config1": 1,
"config2": 2,
"calibration_list": [
0.465485,
0.693291,
0.914242,
0.438485,
0.621781,
0.148442,
0.536921,
0.789463,
0.069955,
0.649050,
]
}
print("before compress", len(json.dumps(origin_data)))
compress_data = origin_data
# contact calibration_list as a bytes string and then base64 encode
calibration_bytes = b"".join(
[bytes([int(x * 255)]) for x in origin_data["calibration_list"]]
)
compress_data["calibration_list"] = base64.b64encode(calibration_bytes).decode("utf-8")
print("after compress", len(json.dumps(compress_data)))
|
输出:
1
2
|
before compress 149
after compress 68
|
config1
和config2
一般是需要人工调整的配置, 所以需要明文表示. calibration_list
一般由机器生成和阅读, 所以不太关注其可读性.
这两种配置又期望用同一个配置文件管理, 那么通过将calibration_list
转换为二进制数据, 然后base64编码, 这样既使得配置文件可以以文本方式解析, 又相对减少了文件大小, 在一些空间/传输速率敏感的场合适用.
以上demo只是一种应用场景, 细节需要具体问题具体分析.
base64编码后的大小约等于原大小的4/3(增大了空间), 压缩比例和base64编码的对象+精度需求相关. 以json格式+7位精度需求的32bit浮点数组为例, 一个数字表示至少需要8B(1B逗号+7B数字), 但是base64编码后只需要6B. 这种情况下压缩率75%.