【发布时间】:2016-08-16 20:36:20
【问题描述】:
从进程内存的非固定长度字节缓冲区中获取精确长度的字符串
我想读取进程(游戏)内存以获取游戏当前已加载到进程内存中的 文件名(字符串)。
预期的字符串没有固定长度,最大可能值为 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。
例如文件名为"abc.bms",长度(String.Lenght)为37。
到目前为止我尝试过的解决方案:-
// string = string.Substring(0, string.IndexOf('\0'));
// string = string.Replace('\0');
// string = string.Trim();
字符串长度不正确,我想从字符串中删除所有那些不可见的字符?
【问题讨论】:
-
您只想删除空字符吗?
var res = str.Replace("\0", string.Empty);? -
不,我想要字符串中的所有额外字符,我想将它与文件系统中的文件名进行比较。显然字符串很好,但它有一些隐藏的额外字符没有给我正确的文件路径。
-
为什么使用 ASCII 作为编码?您似乎将该值用作文件路径。在 Win32 API 中,文件路径是 UTF-16,就像 .NET 中的字符串一样。如果您碰巧正在使用 Win32 函数的 Windows 95 兼容变体 (xxxA)(不支持 NTFS 需要 [Unicode] 的完整字符集)并获得一个具有“ANSI”编码的文件路径,您要么知道它是哪种特定的 ANSI 编码,或者知道它与线程当前的 ANSI 代码页相同。在这种情况下(没有其他情况),您将使用
Encoding.Default。