如何使用 ctypes 位字段在 Python 中构造 32 位 uint?

How to construct 32-bit uint in Python using ctypes bit field?

我想使用Python3 ctypes位域构造一个无符号的32位整数,如下:

c_uint = ctypes.c_uint32

class Flags_bits(ctypes.LittleEndianStructure):
    _fields_ = [ 
            ("a", c_uint, 4),
            ("b", c_uint, 4),
            ("c", c_uint, 4),
            ("d", c_uint, 4),
            ("e", c_uint, 4),
            ("f", c_uint, 4),
            ("g", c_uint, 4),
            ("h", c_uint, 4)]

当我用特定的整数值替换 Flags_bits 时,

aa = Flags_bits(1,2,3,4,5,6,7,8)
print(hexlify(aa).decode('utf-8'))

输出为

21436587

我期待这样的输出

87654321 # binary of 1000 0111 0110 0101 0100 0011 0010 0001

因为 Little-endian 从低位开始构造位。如何获得预期的输出?我做错了什么吗?有人可以这么好心帮助我吗?提前致谢!

已存储 little-endian。 binascii.hexlify 函数将值读取为一组字节,returns 读取这些字节的字符串。它没有将它们视为整数。作为字节,值为 21 43 65 87。除非您将一组字节视为 multi-byte 单元,否则字节顺序不适用。

如果您想将值视为 32 位整数,请执行此操作,结果为 87654321:

import struct
...
aa = Flags_bits(1,2,3,4,5,6,7,8)
aa_int = struct.unpack('I',aa)[0]
print(hex(aa_int))

位域结构存在问题,即使在 C 中也是如此。老实说,在许多情况下,移位和屏蔽更容易:

def Flags_bits(*data):
    val = 0
    for n in reversed(data):
        val = (val << 4) | n
    return val