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

本文关键字:何删除 删除 字符 缓冲区 字节流 转换 字符串 | 更新日期: 2023-09-27 18:02:50

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

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

期望的字符串没有固定长度,最大可能值是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();

字符串长度不正确,我想从字符串中删除所有不可见的字符吗?

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

假设内存中的字符串是以null结尾的ASCII字符串,那么在将缓冲区传递给GetString之前,最好先截断缓冲区。

您可以在pBuffer数组中找到第一个0(null(,分配一个N大小的新缓冲区(其中N是第一个0之前的字节数(。然后将pBuffer中的N个字节复制到新数组,然后将该新数组传递给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);
    }
}
TrimEnd(new char[] { (char)0 })

检查链接以删除空字节:

修剪空字节

似乎与Wiktor的评论相似。