库构造,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
因为使用索引会导致索引错误。
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
因为使用索引会导致索引错误。