Указание условного поля (переключателя) в Python Construct, которое зависит от упреждающего значенияPython

Программы на Python
Ответить
Anonymous
 Указание условного поля (переключателя) в Python Construct, которое зависит от упреждающего значения

Сообщение Anonymous »

Я создаю анализатор для (немного странного) формата, который определяет тег поля данных после записи значения. Гарантируется, что поле значения всегда будет иметь размер 4 байтов, интерпретируемых в зависимости от тега.
Этот код работает (но он громоздок в использовании и требует ручного переключения на правильное поле объединения ):

Код: Выделить всё

SC_Header = Int32ul
SC_Object = Int32ul
SC_String = BitStruct (
"latin1" / Flag,
"buffer" / Flag,
"length" / BitsInteger(30)
)

SC_Pair = Struct (
"value" / Union(0,
"header" / SC_Header,
"object" / SC_Object,
"string" / SC_String,
),
"tag" / Int32ul,
)
Это нормально, но при использовании происходит сбой:

Код: Выделить всё

SC_Header = Int32ul
SC_Object = Int32ul
SC_String = BitStruct (
"latin1" / Flag,
"buffer" / Flag,
"length" / BitsInteger(30)
)

SC_Pair = Struct (
"value" / Switch(lambda ctx: ctx.tag, {
0xFFF10000: SC_Header,
0xFFFF0008: SC_Object,
0xFFFF0004: SC_String,
}),
"tag" / Int32ul,
)
Хотя это работает (для вымышленного формата), в котором значение следует тегу. В моем случае мне нужно заранее просмотреть тег, прежде чем он будет передан в контекст.
Как мне указать поле, чтобы добиться этого?

Подробнее здесь: https://stackoverflow.com/questions/791 ... ds-on-a-lo
Ответить

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

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

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

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

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