2010-07-20 9 views
1

J'essaie de convertir un blob de données de 16 octets retourné par socket.inet_pton en un tableau ctypes d'octets non signés. Ma structure de données ressemble à ceci:transtypage en tableaux dans des ctypes Python

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

Et le blob est juste:

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

Cependant, ces tentatives obtenir des erreurs:

 
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)) 

Tout le code: http://codepad.org/2cjyVXBA

Des idées de quel type je dois me lancer?

Répondre

3

je pourrais être complètement faux ici (et il ne semble un peu complexe) mais cela fonctionne pour moi:

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

je devais convertir les données dans une liste d'entiers et de les déballer pour le constructeur. Il doit y avoir un moyen plus facile!