Конструкция библиотеки, структура ("string" / everythingElse) проблема - PullRequest
0 голосов
/ 12 декабря 2018

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 Ответ

0 голосов
/ 12 декабря 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...