Issue 31987: Ctypes Packing Bitfields Incorrectly - GCC both Linux and Cygwin (original) (raw)

The structure : typedef struct attribute ((packed)) { unsigned int F0:24; unsigned int F3:24; unsigned int F6:24; unsigned int F9:24; } StructF_T; is mapped as expected by GCC under both Linux and Cygwin. As expected, the memory layout seen by the C program is : 0x111111222222333333444444

Using this definition : class StructF(ctypes.BigEndianStructure): pack = 1 fields = [ ('F0', ctypes.c_uint, 24), ('F3', ctypes.c_uint, 24), ('F6', ctypes.c_uint, 24), ('F9', ctypes.c_uint, 24), ] The memory layout seen from Python is not consistent : 0x11111100222222003333330044444400

It seems that the pack option is ignored by ctypes in such a case. I found the same problem using both ctypes.BigEndianStructure and ctypes.LittleEndianStructure