如何从字节流/缓冲区转换为字符串时删除乱码?

时间:2016-08-16 20:36:20

标签: c# string buffer

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

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

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

E.g文件名是" abc.bms" ,其长度(String.Lenght) 37

到目前为止我尝试过的解决方案: -

  // string = string.Substring(0, string.IndexOf('\0'));   
  // string = string.Replace('\0');
  // string = string.Trim();

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

2 个答案:

答案 0 :(得分:0)

TrimEnd(new char[] { (char)0 })

查看删除空字节的链接:

Trim Empty Bytes

似乎与Wiktor的评论相似。

答案 1 :(得分:0)

假设内存中的字符串是以空字符结尾的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);

    }
}