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
或其他东西将其包装起来。
我有这个问题,我不知道如何解决,想知道是否有人给我提示。
这是一个简化的例子:
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
或其他东西将其包装起来。