Python的ctypes位域Windows与Linux

我遇到了一个操作系统相关的问题,在Python ctype中定义了一个相对简单的位域。 该位域在Windows 7 x64下运行良好,但在Ubuntu 12.04 x64上失败。 这两个操作系统都使用Python 2.7解释器。

附加的代码突出了我的问题。 如果我的位域是使用c_uint定义的,则在Ubuntu中失败。 如果我把它切换到c_ushort,它按预期工作。 Windows似乎可以在任何一个定义上工作。

在Windows中,以下代码输出:

1 1 3 1 6 7 8 9 10 11 12 13 14 15 0 1 1 3 1 6 7 8 9 10 11 12 13 14 15 0 

在Linux中,以下代码输出:

 0 1 0 1 0 7 0 9 0 12 0 13 14 15 0 1 1 3 1 6 7 8 9 10 11 12 13 14 15 0 

我已经在Ubuntu / GCC 4和Win / MSVC9下用C ++ 重新编写了这个位域 ,C ++在这两个定义中都是正确的。 所以我总结这是一个Python的具体问题。 任何帮助将不胜感激。

更新 :Per Markus的build议,它似乎是一个Python错误。 所以我在http://bugs.python.org/issue20629提交了一个针对Python bug跟踪器的bug

 import ctypes class BitField1(ctypes.BigEndianStructure): _pack_ = 1 _fields_ = [ ('a', ctypes.c_uint, 3), ('b', ctypes.c_uint, 1), ('c', ctypes.c_uint, 3), ('d', ctypes.c_uint, 1), ('f', ctypes.c_uint, 8), ('g', ctypes.c_uint, 16), ('h', ctypes.c_uint, 16), ('i', ctypes.c_uint, 16), ('j', ctypes.c_uint, 8), ('k', ctypes.c_uint, 8), ('l', ctypes.c_uint, 8), ('m', ctypes.c_uint, 8), ('n', ctypes.c_ulonglong, 56), ('o', ctypes.c_ulonglong, 4), ('p', ctypes.c_ulonglong, 4) ] class BitField1U(ctypes.Union): _pack_ = 1 _fields_ = [("fields", BitField1), ("raw_bytes", ctypes.c_ubyte * 20)] class BitField2(ctypes.BigEndianStructure): _pack_ = 1 _fields_ = [ ('a', ctypes.c_ushort, 3), ('b', ctypes.c_ushort, 1), ('c', ctypes.c_ushort, 3), ('d', ctypes.c_ushort, 1), ('f', ctypes.c_ushort, 8), ('g', ctypes.c_ushort, 16), ('h', ctypes.c_ushort, 16), ('i', ctypes.c_ushort, 16), ('j', ctypes.c_ushort, 8), ('k', ctypes.c_ushort, 8), ('l', ctypes.c_ushort, 8), ('m', ctypes.c_ushort, 8), ('n', ctypes.c_ulonglong, 56), ('o', ctypes.c_ulonglong, 4), ('p', ctypes.c_ulonglong, 4) ] class BitField2U(ctypes.Union): _pack_ = 1 _fields_ = [("fields", BitField2), ("raw_bytes", ctypes.c_ubyte * 20)] def setup(fields) : fields.a = 1 fields.b = 1 fields.c = 3 fields.d = 1 fields.f = 6 fields.g = 7 fields.h = 8 fields.i = 9 fields.j = 10 fields.k = 11 fields.l = 12 fields.m = 13 fields.n = 14 fields.o = 15 fields.p = 16 def printFields(fields) : print(fields.a), print(fields.b), print(fields.c), print(fields.d), print(fields.f), print(fields.g), print(fields.h), print(fields.i), print(fields.j), print(fields.k), print(fields.l), print(fields.m), print(fields.n), print(fields.o), print(fields.p) b1 = BitField1U() b2 = BitField2U() setup(b1.fields) setup(b2.fields) printFields(b1.fields) printFields(b2.fields)