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

在Python Construct中能否实现位交换的枚举类型?

问题分析

你的问题出在BitsSwapped对整个字节位反转后,Configuration字段的两位解析顺序不符合预期:

  • 原始字节0x43的二进制是0100 0011,经过BitsSwapped后整个字节位反转,变为1100 0010
  • Configuration作为最后2位字段,会取反转后的bit1和bit0(对应原字节的bit6和bit7),组成二进制10即十进制2,对应枚举Right;但你需要的是原字节bit7和bit6组成的01即十进制1,对应枚举Two——本质是这两位的位序被反转了。
解决方案

方法1:用ExprAdapter交换两位顺序(推荐,语义保持一致)

通过ExprAdapter在解析和编码时交换Configuration字段两位的高低位,让数值映射符合预期:

Byte_EOL = BitsSwapped(
    BitStruct(
        "1_Present" / Flag,     
        "2_Present" / Flag,
        "2_Strategy" / Flag,
        "Side" / Enum(              
            BitsInteger(1),                     
            Left_Side=0,
            Right_Side=1
        ),                    
        "3_Present" / Flag,             
        "3_Strategy" / Flag,        
        "Configuration" / Enum(
            ExprAdapter(
                BitsInteger(2),
                decoder=lambda x: ((x & 1) << 1) | ((x >> 1) & 1),  # 交换高低位:10 → 01
                encoder=lambda x: ((x & 1) << 1) | ((x >> 1) & 1)   # 编码时同步反转
            ),
            No=0,
            Two=1,
            Right=2,
            Left=3
        )
    )
)

方法2:调整枚举映射(快速临时解决)

如果不想修改结构逻辑,可直接交换枚举的数值映射,让反转后的数值对应正确语义:

"Configuration" / Enum(      
    BitsInteger(2),
    No=0,
    Two=2,  # 对应原Right的数值
    Right=1, # 对应原Two的数值
    Left=3
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 20:23:17