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

Library construct, struct("string"/anythingElse) issue

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

这是行不通的。我该如何解决这个问题?

varBytes[0] 是一个字符串,您需要的是 construct 模块中的 Int16ul 对象。

您需要将字符串转换为对象,您可以通过将 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 因为使用索引会导致索引错误。