A little comments of ctypes and construct.

一首诗 newptcai at gmail.com
Fri Nov 21 07:20:44 EST 2008


I didn't try your code.  That might be working since it a completely
different method.

What mean is

pack works:
=========================
class POINT(Structure):

     _fields_ = [('x', c_int), ('y', c_int)]

p = POINT(1,2) p.x, p.y (1, 2) str(buffer(p))
s = str(buffer(p))
=========================

unpack doesn't
=========================
p2 = POINT() ctypes.memmove(p2, s, ctypes.sizeof(POINT)) 14688904
p2.x, p2.y
=========================

I am not trying to parse data generated by a dll, but data received
from network.
That's also why I need Big Endian.

On Nov 21, 6:30 pm, Aaron Brady <castiro... at gmail.com> wrote:
> On Nov 21, 2:28 am, 一首诗 <newpt... at gmail.com> wrote:
>
>
>
> > Hi all,
>
> > Recently I asked a question on this group:
>
> > >> What's your choice when handle complicated C structures.
> snip
>
> > typedef struct _Point
> > {
> >    int x;
> >    int y;
>
> > } Point;
>
> > typedef struct _Shape
> > {
> >   int z;
> >   Point ap[2];
>
> > }Shape;
> snip
> > 2. BigEndianStructure can not be nested.  So.  If you need bid endian,
> > you got bad luck.
>
> A bug is filed about this.
>
> I have this code working:
>
> import ctypes as c
> class Point( c.LittleEndianStructure ):
>     _fields_= [
>         ( 'x', c.c_int ),
>         ( 'y', c.c_int )
>     ]
>
> class Shape( c.LittleEndianStructure ):
>     _fields_= [
>         ( 'z', c.c_int ),
>         ( 'ap', Point* 2 )
>     ]
>
> lib= c.WinDLL( 'ng36ext.pyd' )
> lib.make.argtypes= [ ]
> lib.make.restype= Shape
> shape= lib.make( )
> print shape.z, shape.ap[0].x, shape.ap[0].y, shape.ap[1].x, shape.ap
> [1].y
>
> /Output:
>
> 10 20 30 40 50
> 20
> 10 20 30 40 50
>
> /Definition for 'make':
>
> Shape make( void ) {
>     Shape shape;
>     shape.z= 10;
>     shape.ap[ 0 ].x= 20;
>     shape.ap[ 0 ].y= 30;
>     shape.ap[ 1 ].x= 40;
>     shape.ap[ 1 ].y= 50;
>     printf( "%i %i %i %i %i\n", shape.z, shape.ap[0].x, shape.ap[0].y,
> shape.ap[1].x, shape.ap[1].y );
>     printf( "%i\n", sizeof( shape ) );
>     return shape;
>
> }
>
> What is your next step?




More information about the Python-list mailing list