Python – Конструкция – Пустые поляPython

Программы на Python
Ответить
Anonymous
 Python – Конструкция – Пустые поля

Сообщение Anonymous »

Я пытаюсь проанализировать двоичные данные, определяя структуры с помощью библиотеки Construct. Однако иногда мои двоичные данные могут не содержать все ожидаемые поля, поскольку некоторые из них являются необязательными.
Я безуспешно пытался использовать вычисление размера внутри необязательных полей в операторе 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
Как видите, скрипт анализирует 4 элемента, хотя на самом деле их всего 3. 2 с данными и 1 без них.

Подробнее здесь: https://stackoverflow.com/questions/793 ... pty-fields
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»