C# 如何在从字节流/缓冲区转换为字符串时删除垃圾字符?
从进程内存中的字节非固定长度缓冲区获取精确长度的字符串 我想读取进程(游戏)内存,以获取进程内存中当前加载的游戏地图的文件名(字符串) 预期的字符串没有固定长度,最大可能值为37,因此我声明了长度为37的缓冲区 通过使用Win32 API,读取部分很容易C# 如何在从字节流/缓冲区转换为字符串时删除垃圾字符?,c#,string,buffer,C#,String,Buffer,从进程内存中的字节非固定长度缓冲区获取精确长度的字符串 我想读取进程(游戏)内存,以获取进程内存中当前加载的游戏地图的文件名(字符串) 预期的字符串没有固定长度,最大可能值为37,因此我声明了长度为37的缓冲区 通过使用Win32 API,读取部分很容易 byte[] pBuffer = new byte[37]; ReadProcessMemory((int)processHandle, (int)address, pBuffer, 37, ref read); 下面是将字节转换为字符串的代
byte[] pBuffer = new byte[37];
ReadProcessMemory((int)processHandle, (int)address, pBuffer, 37, ref read);
下面是将字节转换为字符串的代码
string map = Encoding.ASCII.GetString(pBuffer);
输出正常,但字符串包含隐藏在显示中的垃圾字符
当我试图打开文件时,FileExist(map)函数返回false。文件在文件夹中,但我发现字符串.Length对于我从内存中获得的每个字符串都是37
例如,文件名为“abc.bms”,其长度(String.lenght)为37
到目前为止我尝试的解决方案:
// string = string.Substring(0, string.IndexOf('\0'));
// string = string.Replace('\0');
// string = string.Trim();
字符串长度不正确,我想从字符串中删除所有不可见的字符
TrimEnd(new char[] { (char)0 })
签出链接以删除空字节:
与Wiktor的评论类似。假设内存中的字符串是以null结尾的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);
}
}
您只想删除空字符吗<代码>var res=str.Replace(“\0”,string.Empty)代码>?不,我需要字符串中的所有额外字符,我要将其与文件系统中的文件名进行比较。很明显,字符串很好,但它有一些隐藏的额外字符,不能为我提供正确的文件路径。为什么使用ASCII作为编码?您似乎将该值用作文件路径。在Win32 API中,文件路径是UTF-16,就像.NET中的字符串一样。如果您碰巧正在使用Win32函数的Windows 95兼容变体(xxxA)(不支持NTFS所需的完整字符集[Unicode]),并获得带有“ANSI”编码的文件路径,则您必须知道它是哪个特定的ANSI编码,或者知道它与线程当前的ANSI代码页相同。在这种情况下(没有其他情况),您将使用
编码。默认值
。实际上,GetString有一个重载,它需要计数。所以只需将pBuffer和N传递给GetString的重载。您能帮我截断pBuffer数组吗?如何搜索缓冲区数组并创建一个新的,2行代码就可以完成这项工作