gpt4 book ai didi

Python3 ctypes c_unit32 字节序

转载 作者:行者123 更新时间:2023-12-01 02:46:42 25 4
gpt4 key购买 nike

我正在尝试将 PCI 配置空间数据加载到 python 中进行评估,但在使用 BAR0 的 c_unit32 时遇到了问题。我已设法简化问题/脚本以显示 c_uint16 的行为符合我的预期,但 c_uint32 失败。 Bar0 必须是 c_unit32,就像在实际脚本中一样,Bar0 被解码为单独的结构,该结构使用位 0-13 表示各个字段,然后使用位 14:31 表示较低的 BAR。

在脚本中,数据是从/sys/pci/bus/devices/x/config 加载的,因此以十六进制字符的字符串形式返回,在示例中通过加载较小的字符串来仅表示少数几个字符来模拟这一点字段数

预期:

输入字符串:“86802010f6710000”

供应商ID:0x8086
设备ID:0x1020
栏0:0x71f60000

实际:

输入字符串:“86802010f6710000”

供应商ID:0x8086
设备ID:0x1020
栏0:0x71f6

VendorID 和 DeviceID 字段已正确交换。我假设“0000”正在被字节交换并被放在f671前面,然后f671被字节交换为71f6。然后消除前导 00,创建“0x71f6”。如果我使用“f6710100”,它会变成 0x171f6,这一点得到了证实。

<小时/>

如何确保在使用 c_uint32 时将其正确解释为 0x71f60000?

<小时/>

代码:

from ctypes import *


class PCICfg(Structure):

_pack_ = 1
_fields_ = [
("VendorID", c_uint16),
("DeviceID", c_uint16),
("Bar0", c_uint32),
]


class PCIUnion(Union):

_pack_ = 1
_fields_ = [
("ConfigSpace", PCICfg),
("Bytes", c_ubyte * sizeof(PCICfg))
]


def from_str(self, input):

print("Input String: ", input)

hex_data = bytearray.fromhex(input)

for x in range(0, len(hex_data)):
self.Bytes[x] = hex_data[x]


if __name__ == '__main__':

cfg = PCIUnion()
cfg.from_str("86802010f6710100")

print("VID: %s" % hex(cfg.ConfigSpace.VendorID))
print("DID: %s" % hex(cfg.ConfigSpace.DeviceID))
print("BA0: %s" % hex(cfg.ConfigSpace.Bar0))

最佳答案

您所看到的是输入的正确小尾数 32 位结果,但如果您的输入实际上是小尾数 16 位字的十六进制表示,则以这种方式对待它:

from ctypes import *
from binascii import unhexlify

class PCICfg(Structure):
_pack_ = 1
_fields_ = [("VendorID", c_uint16),
("DeviceID", c_uint16),
("Bar0Hi", c_uint16),
("Bar0Lo", c_uint16)]

class PCIUnion(Union):
_pack_ = 1
_fields_ = [("ConfigSpace", PCICfg),
("Bytes", c_ubyte * sizeof(PCICfg))]

def from_str(self, inp):
print("Input String: ", inp)
self.Bytes[:] = unhexlify(inp)

if __name__ == '__main__':
cfg = PCIUnion()
cfg.from_str("86802010f6710100")
print("VID: {:#04x}".format(cfg.ConfigSpace.VendorID))
print("DID: {:#04x}".format(cfg.ConfigSpace.DeviceID))
print("BA0: {:#04x}{:04x}".format(cfg.ConfigSpace.Bar0Hi,cfg.ConfigSpace.Bar0Lo))
Input String:  86802010f6710100
VID: 0x8086
DID: 0x1020
BA0: 0x71f60001

关于Python3 ctypes c_unit32 字节序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45189725/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com