2010-10-13 5 views
1

j'ai les tableaux ci-dessous sur C comment puis-je les interpert à ctypes datatypes intérieur structretraduire des tableaux de c à ctypes python

struct a { 

BYTE a[30]; 
CHAR b[256]; 
}; 

devrait i interpert un tableau fixe comme type de données * la taille que je veux comme le ci-dessous et si oui comment puis-je appeler cette structure comme un paramètre amusant qui prend exemple de cette structure

class a(structure) : 

_fields_ = [ ("a",c_bytes*30), 
       ("b",c_char*256),] 

Répondre

0

cela devrait fonctionner:

from ctypes import Structure, c_bytes, c_char 

class A(Structure): 
    _fields_ = [("a", c_bytes*30), ("b", c_char*256)] 

Ensuite, vous pouvez simplement accéder aux champs de la structure à l'aide de l'opérateur point:

>>> my_a = A() 
>>> my_a.a[4] = 127 
>>> my_a.a[4] 
127 
>>> my_a.b = "test string" 
>>> my_a.b 
'test string' 
>>> my_a.b[2] 
's' 

Vous pouvez également passer la structure directement à une fonction Python arbitraire:

def my_func(a): 
    print "a[0] + a[1] = %d" % (a.a[0] + a.a[1],) 
    print "Length of b = %d" % len(a.b) 

>>> my_a = A() 
>>> my_a.a[0:2] = 19, 23 
>>> my_a.b = "test" 
>>> my_func(my_a) 
a[0] + a[1] = 42 
Length of b = 4 
2

Vous êtes sur la bonne voie. Vous êtes probablement juste manquant la fonction byref(). En supposant que la fonction que vous souhaitez appeler s'appelle * print_struct *, procédez comme suit:

from ctypes import * 

class MyStruct(Structure): 
    _fields_ = [('a',c_byte*30), ('b',c_char*256)] 

s = MyStruct() # Allocates a new instance of the structure from Python 

s.a[5] = 10 # Use as normal 

d = CDLL('yourdll.so') 
d.print_struct(byref(s)) # byref() passes a pointer rather than passing by copy