python - 在 Python ctypes 中转换为数组

标签 python sockets casting ctypes ipv6

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

class in6_addr(ctypes.Structure):
    _fields_ = (("Byte", ctypes.c_ubyte * 16),)

这个 Blob 就是:

data = socket.inet_pton(socket.AF_INET6, "2001::3")

但是,这些尝试会出错:

sin6 = in6_addr()

# TypeError: expected c_ubyte_Array_16 instance, got str
sin6.Byte = data
# TypeError: cast() argument 2 must be a pointer type, not c_ubyte_Array_16
sin6.Byte = ctypes.cast(data, ctypes.c_ubyte * 16)
# TypeError: incompatible types, LP_c_ubyte instance instead of c_ubyte_Array_16 instance
sin6.Byte = ctypes.cast(data, ctypes.POINTER(ctypes.c_ubyte))

所有代码:http://codepad.org/2cjyVXBA

有什么想法我需要转换成什么类型​​吗?

最佳答案

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

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

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

关于python - 在 Python ctypes 中转换为数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3288219/

相关文章:

python - 将 numpy lhs 单位特征向量乘以 numpy 矩阵

c++ - 如何抛弃函数指针的常量性?

pointers - 在 swift 中将 CFContextRef 转换为可变的 void 指针?

sockets - 为 Web 套接字运行多个 channel 的 Rails 5 ActionCable 问题

c - FreeRTOS Select TCP 套接字不可用?

c - 如何将字符串拆分为不同的类型(int 表示数值,char 表示字母)?

python - selenium python 向下翻页 - 未知错误:net::ERR_NAME_NOT_RESOLVED

python - 将 Blobstore API 与 Google Cloud Storage 和动态 html 结合使用

python - Django 迁移删除字段

python - (Python) socket.gaierror : [Errno 11001] getaddrinfo failed