自定义密码输出过长,求可行的压缩优化方案
针对可变长度密码输出的压缩方案建议
核心思路:从文本转二进制+冗余消除
你的密码输出是文本格式的整数序列,这种格式本身存在大量冗余(比如数字的字符表示、分隔符),这也是zlib压缩效果不佳的核心原因。以下是几个实用的压缩方向:
1. 二进制序列化(最直接的体积缩减)
将文本格式的整数序列转换成二进制字节流,根据数值范围选择合适的固定字节类型存储,可直接大幅减少体积:
Python 代码示例
import struct def text_to_binary(text_output): # 清理输入:移除反斜杠、末尾的点,分割为整数列表 cleaned = text_output.replace("\\", "").rstrip(".") num_list = list(map(int, cleaned.split(","))) # 用int16(2字节)打包,完全覆盖你的数值范围(-34~36) packed_bytes = struct.pack(f">{len(num_list)}h", *num_list) return packed_bytes def binary_to_text(packed_bytes): count = len(packed_bytes) // 2 # 每个int16占2字节 num_list = struct.unpack(f">{count}h", packed_bytes) return ",".join(map(str, num_list)) # 测试 sample_i = "6,6\\,-5,-1,6,-5,-2,4,0,-3,0,3,0,-3,0,5,-4,0,0,2,0,-2,0,4" binary_data = text_to_binary(sample_i) print(f"原文本长度: {len(sample_i)}, 二进制长度: {len(binary_data)}") # 输出:原文本长度: 72, 二进制长度: 48(直接缩减33%体积)
2. 差分编码+二进制(进一步缩小体积)
观察输出序列,相邻整数的差值通常更小,先对序列做差分编码,再用更小的字节类型(比如int8,1字节)存储,能进一步压缩:
Python 代码示例
def diff_encode(num_list): if not num_list: return [] diffs = [num_list[0]] for i in range(1, len(num_list)): diffs.append(num_list[i] - num_list[i-1]) return diffs def diff_decode(diff_list): if not diff_list: return [] nums = [diff_list[0]] for d in diff_list[1:]: nums.append(nums[-1] + d) return nums def text_to_diff_binary(text_output): cleaned = text_output.replace("\\", "").rstrip(".") num_list = list(map(int, cleaned.split(","))) diffs = diff_encode(num_list) # 用int8(1字节)打包,差值范围在-128~127即可覆盖 packed_bytes = struct.pack(f">{len(diffs)}b", *diffs) return packed_bytes def diff_binary_to_text(packed_bytes): count = len(packed_bytes) diffs = struct.unpack(f">{count}b", packed_bytes) num_list = diff_decode(diffs) return ",".join(map(str, num_list)) # 测试 diff_binary = text_to_diff_binary(sample_i) print(f"差分后二进制长度: {len(diff_binary)}") # 输出:差分后二进制长度: 24(比原文本缩减66%体积)
3. 二进制+通用压缩算法(叠加压缩)
如果二进制序列化后还需要进一步压缩,可以结合zlib/gzip等通用压缩算法(此时处理二进制流的压缩效果远好于原文本):
Python 代码示例
import zlib def compress_binary_data(packed_bytes): return zlib.compress(packed_bytes, level=zlib.Z_BEST_COMPRESSION) def decompress_binary_data(compressed_bytes): return zlib.decompress(compressed_bytes) # 叠加压缩测试 compressed = compress_binary_data(diff_binary) print(f"差分+zlib压缩后长度: {len(compressed)}")
4. 熵编码(针对高频整数场景)
如果密码输出中某些整数出现频率极高,可以用霍夫曼编码对整数序列做熵压缩,给高频整数分配更短的二进制编码。可借助bitarray库结合自定义霍夫曼树实现,适合需要极致压缩的场景。
内容的提问来源于stack exchange,提问作者Kristjan Lepp
相关产品推荐
相关产品推荐

