为何bytes()打包的数据无法正常恢复?struct与bytes()的差异解析
struct.pack 与 bytes() 生成4字节串的核心差异
两者的本质是编码目标完全不同,生成的字节串含义天差地别:
编码对象与用途
struct.pack('i', 10)是将整数10转换为符合CPU整数存储规范的二进制字节串(这里指定的'i'是4字节小端序有符号整数)。生成的b'\n\x00\x00\x00'直接对应整数10的二进制存储:最低位字节是0x0A(十进制10),剩余三个字节补0,完全服务于整数的二进制序列化/反序列化。bytes('10', 'utf-16')是将**字符串"10"**转换为UTF-16字符编码的字节序列。UTF-16中每个ASCII字符会被编码为2字节,再加上UTF-16默认的BOM(字节顺序标记),最终字节串是字符'1'和'0'的编码值组合,和整数10没有任何关联,它的用途是文本的编码传输/存储。
字节含义解析
- struct生成的字节串,每一位都是整数二进制值的组成部分,按指定字节序(小端/大端)即可直接还原原始整数:
import struct x = struct.pack('i', 10) print(x) # 输出: b'\n\x00\x00\x00' bytes_to_convert = b'\n\x00\x00\x00' bytes_converter = int.from_bytes(bytes_to_convert, byteorder='little', signed=False) print(bytes_converter) # 输出: 10 - UTF-16生成的字节串,每两个字节对应一个字符的编码值(比如
'1'的UTF-16LE编码是0x3100,'0'是0x3000),将这些字节直接转成整数,得到的只是编码值拼接后的数值,和整数10毫无关系:utf16_bytes = bytes('10', 'utf-16') print(utf16_bytes) # 示例输出: b'\xff\xfe1\x000\x00'(带BOM的6字节) result = int.from_bytes(utf16_bytes, byteorder='little', signed=False) print(result) # 输出一串和10无关的大数值
- struct生成的字节串,每一位都是整数二进制值的组成部分,按指定字节序(小端/大端)即可直接还原原始整数:
简单来说,struct是处理整数与二进制存储的转换,bytes()是处理字符串与字符编码的转换,两者设计目标不同,生成的字节串自然不能等同。
内容的提问来源于stack exchange,提问作者user20144486
相关产品推荐
相关产品推荐

