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

2024-04-26 23:59:27 发布

您现在位置:Python中文网/ 问答频道 /正文

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

这不管用。我怎样才能解决这个问题?你知道吗


Tags: 数据id类型列表data定义sync读取数据
1条回答
网友
1楼 · 发布于 2024-04-26 23:59:27

varBytes[0]是一个字符串,您需要的是来自construct模块的Int16ul对象。你知道吗

您需要将字符串转换为对象您可以这样做,通过将getattr应用于模块constructgetattr名称获取对象:

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,因为使用索引会导致索引错误。你知道吗

相关问题 更多 >