我想使用Python3 ctypes位字段构造一个无符号32位int,如下所示:
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从低位开始构造位。我怎样才能得到预期的输出?我做错什么了吗?有人能帮我一下吗?提前感谢!
以小端序存储。binascii.hexlify
函数以字节集的形式读取值,并返回这些字节的字符串。它没有把它们当作整数来处理。以字节为单位,取值为21 43 65 87。除非您将一组字节作为一个多字节单位来处理,否则不适用端倒数。
如果你想看到一个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