Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在从字节流/缓冲区转换为字符串时删除垃圾字符?_C#_String_Buffer - Fatal编程技术网

C# 如何在从字节流/缓冲区转换为字符串时删除垃圾字符?

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); 下面是将字节转换为字符串的代

从进程内存中的字节非固定长度缓冲区获取精确长度的字符串

我想读取进程(游戏)内存,以获取进程内存中当前加载的游戏地图的文件名(字符串)

预期的字符串没有固定长度,最大可能值为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。文件在文件夹中,但我发现字符串.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行代码就可以完成这项工作