从字节流/缓冲区转换为字符串时,如何删除垃圾字符
本文关键字:何删除 删除 字符 缓冲区 字节流 转换 字符串 | 更新日期: 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的评论相似。