如何在C++中实现自定义二进制读写以压缩有限字符向量数据?
自定义二进制编解码实现与文件大小分析
一、自定义编解码的实现
完全可以实现你需求的自定义二进制编解码逻辑,核心是给每个目标字符分配固定长度的二进制位(这里是2位),再将二进制位拼接成字节流存储。
编码逻辑
先建立字符与2位二进制的映射:
- A → 00(十进制0)
- B → 01(十进制1)
- C → 10(十进制2)
- D → 11(十进制3)
以"BADC"为例,依次转换后得到二进制串01 00 11 10,刚好8位(1字节),对应十六进制0x4E(ASCII字符'N')。
用Python实现的编码函数示例:
def custom_encode(input_str): char_to_bit = {'A': 0, 'B': 1, 'C': 2, 'D': 3} result_byte = 0 # 逐个字符处理,按左移对应位数拼接 for idx, char in enumerate(input_str): result_byte |= char_to_bit[char] << (6 - 2 * idx) return bytes([result_byte])
调用custom_encode("BADC")会返回b'N',即符合要求的二进制编码结果。
解码逻辑
解码时反向操作,将字节拆分为2位一组,映射回原字符:
def custom_decode(input_byte): bit_to_char = {0: 'A', 1: 'B', 2: 'C', 3: 'D'} byte_value = input_byte[0] result_chars = [] # 从高位到低位拆分2位一组 for idx in range(4): bit_segment = (byte_value >> (6 - 2 * idx)) & 0b11 result_chars.append(bit_to_char[bit_segment]) return ''.join(result_chars)
调用custom_decode(b'N')会还原得到"BADC"。
二、编码后的文件大小
是的,仅存储编码后的字节时(不含文件名、文件头、校验信息等额外内容),"BADC"这类4个字符的内容会占用1字节。
如果字符总数不是4的倍数,需要做补位处理(比如在二进制串末尾补0凑满8位),同时解码时要记录原始字符长度,避免把补位的0误判为有效字符。比如3个字符会生成6位二进制,补2位0后占1字节,解码时只取前3个字符对应的二进制段即可。
三、UTF编码效果差的原因
UTF-8、UTF-16等通用编码是为兼容全字符集设计的,对于ASCII范围内的字符,UTF-8每个字符至少占1字节,4个字符就需要4字节;UTF-16则每个字符占2字节,体积更大。而你的场景仅涉及4种字符,自定义编码能将每个字符压缩到2位,4个字符刚好1字节,压缩效率远高于通用编码。
内容的提问来源于stack exchange,提问作者NaYu
相关产品推荐
相关产品推荐

