在 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 中转换为数组的主要内容,如果未能解决你的问题,请参考以下文章

将 ctypes int** 转换为 numpy 二维数组

将 C 指针转换为 Python numpy 数组

将 ctype 字节数组转换为字节

使用 ctypes 将 python dict 转换为结构

如何将指向c数组的指针转换为python数组

ctypes - 将 c++ 函数的输出转换为 python 对象