[issue20629] Python ctypes BigEndianStructure bitfield assignment misbehavior in Linux
Brian Trotter
report at bugs.python.org
Fri Sep 11 21:18:43 CEST 2015
Brian Trotter added the comment:
I am experiencing the same bug with c_uint32 bitfields inside BigEndianStructure in Python 3.4.0 on Ubuntu 14.04.3 x64. No problem in Windows 7 x64. As shown in the example below, the fourth byte is the only one that is written correctly. This is a rather significant error.
Source:
import ctypes
class BitFieldsBE(ctypes.BigEndianStructure):
_pack_ = 1
_fields_ = [
('a', ctypes.c_uint32, 8),
('b', ctypes.c_uint32, 8),
('c', ctypes.c_uint32, 8),
('d', ctypes.c_uint32, 8)]
class BitFieldsLE(ctypes.LittleEndianStructure):
_pack_ = 1
_fields_ = [
('a', ctypes.c_uint32, 8),
('b', ctypes.c_uint32, 8),
('c', ctypes.c_uint32, 8),
('d', ctypes.c_uint32, 8)]
be = BitFieldsBE()
le = BitFieldsLE()
def prints(arg):
print(arg)
print('be',bytes(be))
print('le',bytes(le))
prints('00000000')
be.a = 0xba; be.b = 0xbe; be.c = 0xfa; be.d = 0xce
le.a = 0xba; le.b = 0xbe; le.c = 0xfa; le.d = 0xce
prints('babeface')
be.a = 0xde; be.b = 0xad; be.c = 0xbe; be.d = 0xef
le.a = 0xde; le.b = 0xad; le.c = 0xbe; le.d = 0xef
prints('deadbeef')
Output:
00000000
be b'\x00\x00\x00\x00'
le b'\x00\x00\x00\x00'
babeface
be b'\x00\xfa\x00\xce'
le b'\xba\xbe\xfa\xce'
deadbeef
be b'\x00\xbe\x00\xef'
le b'\xde\xad\xbe\xef'
----------
nosy: +Brian Trotter
type: -> behavior
versions: +Python 3.4
_______________________________________
Python tracker <report at bugs.python.org>
<http://bugs.python.org/issue20629>
_______________________________________
More information about the Python-bugs-list
mailing list