【问题标题】:casting to Arrays in Python ctypes在 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

任何想法我需要转换为什么类型?

【问题讨论】:

    标签: python sockets casting ctypes ipv6


    【解决方案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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-20
        • 2011-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多