在 Python ctypes 中转换为数组
Posted
技术标签:
【中文标题】在 Python ctypes 中转换为数组【英文标题】:casting to Arrays in Python ctypes 【发布时间】:2010-07-20 08:34:35 【问题描述】:我正在尝试将 socket.inet_pton 返回的 16 字节数据块转换为无符号字节的 ctypes 数组。我的数据结构如下所示:
类 in6_addr(ctypes.Structure): _fields_ = (("字节", ctypes.c_ubyte * 16),)而 blob 只是:
数据 = socket.inet_pton(socket.AF_INET6, "2001::3")但是,这些尝试会出错:
sin6 = in6_addr() # TypeError: 预期的 c_ubyte_Array_16 实例,得到了 str sin6.Byte = 数据 # TypeError: cast() 参数 2 必须是指针类型,而不是 c_ubyte_Array_16 sin6.Byte = ctypes.cast(数据, ctypes.c_ubyte * 16) # TypeError: 不兼容的类型,LP_c_ubyte 实例而不是 c_ubyte_Array_16 实例 sin6.Byte = ctypes.cast(数据,ctypes.POINTER(ctypes.c_ubyte))全部代码:http://codepad.org/2cjyVXBA
任何想法我需要转换为什么类型?
【问题讨论】:
【参考方案1】:我在这里可能完全错了(而且看起来确实有点复杂)但这对我有用:
sin6.Byte = (ctypes.c_ubyte*16)(*list(bytearray(data)))
我必须将数据转换为整数列表并为构造函数解包。一定有更简单的方法!
【讨论】:
【参考方案2】:可以说更容易:
sin6.Byte = cast(data, ctypes.POINTER(ctypes.c_ubyte * 16)).contents
或:
sin6.Byte = (ctypes.c_ubyte * 16)(*[x for x in data])
使用字节流:
import io
io.BytesIO(data).readinto(sin6.Byte)
并且由于考虑的结构包含单个字段,因此可以省略字段名称:
sin6 = cast(data, ctypes.POINTER(ctypes.c_ubyte * 16)).contents
sin6 = (ctypes.c_ubyte * 16)(*[x for x in data])
io.BytesIO(data).readinto(sin6)
【讨论】:
以上是关于在 Python ctypes 中转换为数组的主要内容,如果未能解决你的问题,请参考以下文章