diff -r a858cde113f2 -r 413736d50da1 Lib/ctypes/test/test_bitfields.py --- a/Lib/ctypes/test/test_bitfields.py Sat Jan 24 19:26:18 2015 -0800 +++ b/Lib/ctypes/test/test_bitfields.py Wed Jun 24 17:34:18 2015 +0200 @@ -259,5 +259,18 @@ x.a = 0xFEDCBA9876543211 self.assertEqual(x.a, 0xFEDCBA9876543211) + @need_symbol('c_uint32') + def test_uint32_swap(self): + class X(BigEndianStructure): + _fields_ = [("pad", c_uint32, 16), + ("a" , c_uint32, 4), + ("b" , c_uint32, 12)] + b = bytearray(4) + x = X.from_buffer(b) + x.a = 1 + self.assertEqual(b, b'\x00\x00\x10\x00') + x.b = 0x234 + self.assertEqual(b, b'\x00\x00\x12\x34') + if __name__ == "__main__": unittest.main() diff -r a858cde113f2 -r 413736d50da1 Modules/_ctypes/cfield.c --- a/Modules/_ctypes/cfield.c Sat Jan 24 19:26:18 2015 -0800 +++ b/Modules/_ctypes/cfield.c Wed Jun 24 17:34:18 2015 +0200 @@ -765,6 +765,7 @@ if (get_ulong(value, &val) < 0) return NULL; memcpy(&field, ptr, sizeof(field)); + field = SWAP_INT(field); field = SET(unsigned int, field, (unsigned int)val, size); field = SWAP_INT(field); memcpy(ptr, &field, sizeof(field));