Python使用ctypes映射32位内存值到结构体遇异常,求解决方案
内存映射结构体的问题及字段结构求解
原始问题
给定32位值组成的内存列表:
[0x7E008000, 0x1234AAAA, 0xBBBBFFFF]
预期将其映射为结构体后输出:
ns: 0x7d008000 us: 0x1234 zs: 0xaaaabbbb crc: 0xffff
但现有代码得到的zs值不符合预期,启用crc字段时还会报错,当前代码输出:
ns: 0x7d008000 us: 0x1234 zs: 0xbbbbffff
对应的实现代码如下:
import struct import ctypes class MemoryParser: @classmethod def parse_memory(cls, memory): memory_bytes = bytearray() for word in memory: # 将32位值转换为大端字节 word_bytes = struct.pack(">I", word) memory_bytes.extend(word_bytes) # 创建ctypes字节缓冲区 ubuffer = (ctypes.c_ubyte * len(memory_bytes)).from_buffer(memory_bytes) # 从缓冲区生成结构体实例 return cls.from_buffer(ubuffer) class Data(MemoryParser, ctypes.BigEndianStructure): _fields_ = [("ns", ctypes.c_uint32), ("us", ctypes.c_uint16), ("zs", ctypes.c_uint32)] #("crc", ctypes.c_uint16)] memory = [0x7E008000, 0x1234AAAA, 0xBBBBFFFF] data = Data.parse_memory(memory) print("ns:", hex(data.ns)) print("us:", hex(data.us)) print("zs:", hex(data.zs)) #print("crc:", hex(data.crc))
更新1:新增数据集的字段结构求解
新的内存列表:
[0x7E008000, 0x1234AAAA, 0xBBBBFFFC, 0xCCCDDEEE]
预期映射后的结构体输出为:
v1 = 0x7E008000 v2 = 0x1234 v3 = 0xAAAABBBB v4 = 0xFFF v5 = 0xCCCC v6 = 0xDD v7 = 0xEEEE
需要给出对应的ctypes结构体字段定义。
内容的提问来源于stack exchange,提问作者user777304
相关产品推荐
相关产品推荐

