Я безуспешно пытался использовать вычисление размера внутри необязательных полей в операторе If.
Фрагмент кода:
Код: Выделить всё
from construct import *
item = Struct(
"item_size" / Int32ul, # 4 (represents size(item) meaning itself + crc included)
"key_type" / Byte, # 1
"key" / Switch(
this.key_type, {
0x00: Int32ul, # 4
0x01: Struct(
"key_length" / Byte, # 1
"key" / Bytes(this.key_length) # key_length
)
}
),
# Only present if the item size is greater than size(item_size)+size(key_type)+size(key)+size(crc)
"value_type" / If(
this.item_size > (4+1+4 + (4 if this.key_type == 0x00 else 1+this.key.key_length)),
Byte
),
# Only present if the item size is greater than size(item_size)+size(key_type)+size(key)+size(crc)
"value" / If(this.item_size > (4+1+4 + (4 if this.key_type == 0x00 else 1+this.key.key_length)), Switch(
this.value_type, {
0x04: Bytes(10),
}
)),
"crc" / Int32ul # 4
)
container = Struct(
"items" / GreedyRange(item)
)
item_example_no_value = b"\x10\x00\x00\x00\x01\x06\x68\x65\x6c\x6c\x6f\x21\x71\x57\xd7\x35"
"""
10000000 # item_size (16)
01 # key_type
06 # key_length
68656c6c6f21 # actual key value
# Here we have no value_type/value
7157d735 # crc
"""
item_example_with_value = b"\x17\x00\x00\x00\x01\x04\x69\x64\x65\x61\x04\x68\x65\x6C\x6C\x6F\x77\x6F\x72\x6C\x64\x21\xcf\x60\x51"
"""
17000000 # item_size (23)
01 # key_type
04 # key_length
69646561 # key
04 # value_type
68656c6c6f776f726c64 # value
21cf6051 # crc
"""
data = item_example_with_value + item_example_no_value + item_example_with_value
print(container.parse(data))
Код: Выделить всё
Container:
items = ListContainer:
Container:
item_size = 23
key_type = 1
key = Container:
key_length = 4
key = b'idea' (total 4)
value_type = 4
value = b'helloworld' (total 10)
crc = 1365298977
Container:
item_size = 16
key_type = 1
key = Container:
key_length = 6
key = b'hello!' (total 6)
value_type = 113
value = None
crc = 389404503
Container:
item_size = 16777216
key_type = 4
key = None
value_type = 105
value = None
crc = 73491812
Container:
item_size = 1819043176
key_type = 111
key = None
value_type = 119
value = None
crc = 1684828783
Подробнее здесь: https://stackoverflow.com/questions/793 ... pty-fields
Мобильная версия