在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
相关产品推荐
相关产品推荐

