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
相关产品推荐
相关产品推荐

