You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python ctypes调用ReadProcessMemory遇0终止读取的问题求助

问题原因与解决办法

原因

你用read_buffer.value返回结果时,c_char数组的.value属性会把数据当作以空字符\0结尾的C风格字符串处理,一旦遇到第一个值为0的字节(也就是\0)就会自动截断,所以只返回了到第一个0之前的内容,而非完整的0x400字节数据。

解决办法

根据你的需求,有两种可行方案:

方案1:获取完整字节序列

直接将c_char数组转换为Python的bytes对象,它会保留整个缓冲区的所有字节(包括\0):

read_buffer = (ctypes.c_char * buffsize)()
lp_buffer = ctypes.byref(read_buffer)
n_size = ctypes.sizeof(read_buffer)
lp_number_of_bytes_read = ctypes.c_ulong(0)
# 建议检查读取是否成功
success = ctypes.windll.kernel32.ReadProcessMemory(
    self.handle, 
    ctypes.c_void_p(lp_base_address), 
    lp_buffer, 
    n_size, 
    lp_number_of_bytes_read
)
if not success:
    raise RuntimeError(f"读取失败,错误码: {ctypes.GetLastError()}")
return bytes(read_buffer)

方案2:转换为整数列表(对应C++的字节数组)

如果需要和C++一样得到每个字节的整数值列表,可以用列表推导或者直接转成列表:

# 方式1:列表推导
return [int(read_buffer[i]) for i in range(buffsize)]
# 方式2:直接转列表(更简洁)
return list(read_buffer)

这两种方式都不会被\0截断,能拿到完整的0x400条数据。

内容的提问来源于stack exchange,提问作者emilector

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 01:27:16