You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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是处理整数与二进制存储的转换,bytes()是处理字符串与字符编码的转换,两者设计目标不同,生成的字节串自然不能等同。

内容的提问来源于stack exchange,提问作者user20144486

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 04:05:18