库构造,struct(“ string” / anythingElse)问题

时间:2018-12-12 13:21:36

标签: python parsing construct

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])

这不起作用。我该如何解决这个问题?

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用作索引会导致索引错误。