Конструкция библиотеки, структура ("string"/ everythingElse) проблема

Construct - это библиотека для разбора шестнадцатеричных данных. После прочтения данных вы должны сначала определить карту, а затем проанализировать ее. Вы можете найти пример ниже;

....
data, addr = self.s.recvfrom(1024)

c = Struct("sync"/Int16ul, "ID"/Float32l)

x = c.parse(data)

print(x.sync)
print(x.ID)

Моя проблема здесь заключается в том, что я читаю типы данных, для нашего примера Int16ul и Float32l, из списка с именем "varBytes" программно, и их тип "str", как и ожидалось. Имена данных "sync" и "ID" также находятся в списке с именем "varNames". Ниже я попробовал;

c = Struct(varNames[0]/varBytes[0],varNames[1]/varBytes[1])

Это не работает. Как я могу решить эту проблему?

1 ответ

Решение

varBytes[0] это строка, где как то, что вам нужно, это Int16ul объект из construct модуль.

Вам нужно превратить строку в объект, который вы можете сделать, получив объект по имени getattr применяется к модулю construct:

varNames[0]/getattr(construct, varBytes[0])

Итак, ваш пример становится:

import construct
from construct import Struct

c = Struct(varNames[0]/getattr(construct, varBytes[0]),
           varNames[1]/getattr(construct, varBytes[1]))

Чтобы построить список аргументов из пары списков, можно применить Struct к списку:

c = Struct(*[varName/getattr(construct, varByte) 
             for varName, varByte in zip(varNames, varBytes)])

Это использует zip как использование индексов делает для ошибок индекса.

Другие вопросы по тегам