Конструкция библиотеки, структура ("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
как использование индексов делает для ошибок индекса.