Construct是用于解析十六进制数据的解析库。读取数据后,您首先必须定义地图,然后解析它。您可以在下面找到一个示例;
....
data, addr = self.s.recvfrom(1024)
c = Struct("sync"/Int16ul, "ID"/Float32l)
x = c.parse(data)
print(x.sync)
print(x.ID)
我的问题是我正在以编程方式从名为“ varBytes”的列表中读取示例Int16ul和Float32l的数据类型,并且它们的类型为“ str”。数据名称“ sync”和“ ID”也在名为“ varNames”的列表中。 以下是我尝试过的内容;
c = Struct(varNames[0]/varBytes[0],varNames[1]/varBytes[1])
这不起作用。我该如何解决这个问题?
答案 0 :(得分: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
用作索引会导致索引错误。