Python 构造 - 如何在结构中使用按位构造

Python Construct - How to use a bitwise construct inside a struct

我有这个问题,我不知道如何解决,想知道是否有人给我提示。

这是一个简化的例子:

from construct import Struct, Enum, Byte, Switch, this, Flag

one_protocol = Struct(
    "enable" / Flag
)

protocol = Struct(
    "type" / Enum(
        Byte,
        one=0xA2,
        two=0x02,
    ),
    "data" / Switch(
        this.type,
        {
            "one": one_protocol
        }
    ),
)

input_1 = "A201"
input_2 = "A202"
print(protocol.parse(bytes.fromhex(input_1)))
print(protocol.parse(bytes.fromhex(input_2)))

它按预期工作。输出为:

Container:
    type = (enum) one 162
    data = Container:
        enable = True
Container:
    type = (enum) one 162
    data = Container:
        enable = True

问题是我希望我的 one_protocol 在位级别工作。更具体地说,我希望 enable 字段反映第一位的值而不是整个字节的值。换句话说,我想得到 enable = False for input_2.

我知道 BitStruct 不能嵌套。但无论如何,我已经尝试用 Bitstruct 替换第一个 Struct 并将 Flag 替换为 Bitwise(Flag).

有什么想法吗?

这里是Construct的作者。

oneprotocol 没有理由不能成为 BitStruct。您不能将 Bitwise 嵌套在另一个 Bitwise 中,但这里不是这种情况。

您不能使用 Bitwise(Flag),因为 Bitwise 会期望消耗所有 8 位(或 8 位的倍数),而 Flag 只占用一位。

您也不能将 protocol 设为 BitStruct,因为这样枚举将无法正常工作,除非您用 Bytewise 或其他东西将其包装起来。