如何使用 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
我想使用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