以Python ctypes转换为数组

问题描述 投票:1回答:2

我正在尝试将socket.inet_pton返回的16字节数据块转换为无符号字节的ctypes数组。我的数据结构如下所示:

in6_addr(ctypes.Structure)类:_fields_ =((“ Byte”,ctypes.c_ubyte * 16),)

并且斑点只是:

数据= socket.inet_pton(socket.AF_INET6,“ 2001 :: 3”)

但是,这些尝试会出错:

sin6 = in6_addr()#TypeError:预期的c_ubyte_Array_16实例,得到了strsin6.Byte =数据#TypeError:cast()参数2必须是指针类型,而不是c_ubyte_Array_16sin6.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

任何想法我需要转换为哪种类型?

python sockets casting ctypes ipv6
2个回答
3
投票

我在这里可能是完全错误的(看起来确实有点复杂),但这对我有用:

sin6.Byte = (ctypes.c_ubyte*16)(*list(bytearray(data)))

我必须将数据转换为整数列表,并为构造函数解压缩它们。必须有一个更简单的方法!


0
投票

可以说很容易:

sin6.Byte = cast(data, ctypes.POINTER(ctypes.c_ubyte * 16)).contents

或:

sin6.Byte = (ctypes.c_ubyte * 16)(*[x for x in data])
© www.soinside.com 2019 - 2024. All rights reserved.