我想使用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从低位开始构造位.如何获得预期的输出?我做错什么了吗?有人能帮我吗?提前感谢!

推荐答案

它存储在little endian中.binascii.hexlify函数将值读取为一组字节,并返回这些字节的字符串.这不是把它们当作一个整数.作为字节,值为21 43 65 87.除非将一组字节视为多字节单位,否则endianness不适用.

如果要将该值视为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语言中,位场 struct 也是有问题的.老实说,在许多情况下,移位和屏蔽更容易:

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

Python相关问答推荐

在Python中为变量的缺失值创建虚拟值

Pandas 都是(),但有一个门槛

Vectorize多个头寸的止盈/止盈回溯测试pythonpandas

如果值不存在,列表理解返回列表

基于字符串匹配条件合并两个帧

如何在Python数据框架中加速序列的符号化

如何从pandas的rame类继承并使用filepath实例化

为什么抓取的HTML与浏览器判断的元素不同?

如何设置视频语言时上传到YouTube与Python API客户端

利用Selenium和Beautiful Soup实现Web抓取JavaScript表

Python列表不会在条件while循环中正确随机化'

Polars Group by描述扩展

一个telegram 机器人应该发送一个测验如何做?""

为什么我只用exec()函数运行了一次文件,而Python却运行了两次?

Polars定制函数返回多列

如何在Pandas中用迭代器求一个序列的平均值?

如何从一个维基页面中抓取和存储多个表格?

通过对列的其余部分进行采样,在Polars DataFrame中填充_null`?

如何将验证器应用于PYDANC2中的EACHY_ITEM?

使用Scikit的ValueError-了解