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 <[EMAIL PROTECTED]> wrote: > On Nov 21, 2:28 am, 一首诗 <[EMAIL PROTECTED]> 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? -- http://mail.python.org/mailman/listinfo/python-list