从进程内存的非固定长度缓冲区获取精确长度的字符串
我想阅读一个进程(游戏)内存,以获取游戏当前加载到进程内存中的文件名(字符串)。
期望的字符串没有固定长度,最大可能值为37,所以我声明了长度为37的缓冲区。
使用Win32 API轻松读取部分。
byte[] pBuffer = new byte[37];
ReadProcessMemory((int)processHandle, (int)address, pBuffer, 37, ref read);
以下是将字节转换为字符串的代码。
string map = Encoding.ASCII.GetString(pBuffer);
输出正常,但字符串中包含隐藏显示的乱码。
当我尝试打开文件时, FileExist(map)函数返回false。这些文件存在于文件夹中,但我发现String.Length对于我从内存中获取的每个字符串都是37。
E.g文件名是" abc.bms" ,其长度(String.Lenght) 37 。
到目前为止我尝试过的解决方案: -
// string = string.Substring(0, string.IndexOf('\0'));
// string = string.Replace('\0');
// string = string.Trim();
字符串长度不正确,我想从字符串中删除所有这些不可见的字符?
答案 0 :(得分:0)
答案 1 :(得分:0)
假设内存中的字符串是以空字符结尾的ASCII字符串,那么在将缓冲区传递给GetString之前,最好截断缓冲区。
你可以在pBuffer数组中找到第一个0(null),分配一个N大小的新缓冲区(其中N是第一个0之前的字节数)。然后将n个字节从pBuffer复制到新数组,然后将该新数组传递给GetString。
更新:示例代码
using System;
using System.Linq;
using System.Text;
public class Program
{
public static void Main()
{
byte[] x = new byte[] { 55,55,55,93,93,0,23,0};
var firstNullIndex = Array.FindIndex(x, b => b == 0);
string s = Encoding.Default.GetString(x, 0, firstNullIndex);
Console.WriteLine(s);
}
}