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...@gmail.comwrote:
Quote:
On Nov 21, 2:28 am, 一首诗 <newpt...@gmail.comwrote:
>
>
>
>
Quote:
Recently I asked a question on this group:
>
Quote:
Quote:
>What's your choice when handle complicated C structures.
snip
>
Quote:
typedef struct _Point
{
int x;
int y;
>
>
Quote:
typedef struct _Shape
{
int z;
Point ap[2];
>
snip
Quote:
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?