【问题标题】:How to remove garbage characters when converting from Bytes Stream/buffer to String?从字节流/缓冲区转换为字符串时如何删除垃圾字符?
【发布时间】:2016-08-16 20:36:20
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您只想删除空字符吗? var res = str.Replace("\0", string.Empty);?
  • 不,我想要字符串中的所有额外字符,我想将它与文件系统中的文件名进行比较。显然字符串很好,但它有一些隐藏的额外字符没有给我正确的文件路径。
  • 为什么使用 ASCII 作为编码?您似乎将该值用作文件路径。在 Win32 API 中,文件路径是 UTF-16,就像 .NET 中的字符串一样。如果您碰巧正在使用 Win32 函数的 Windows 95 兼容变体 (xxxA)(不支持 NTFS 需要 [Unicode] 的完整字符集)并获得一个具有“ANSI”编码的文件路径,您要么知道它是哪种特定的 ANSI 编码,或者知道它与线程当前的 ANSI 代码页相同。在这种情况下(没有其他情况),您将使用Encoding.Default

标签: c# string buffer


【解决方案1】:
TrimEnd(new char[] { (char)0 })

查看链接以删除空字节:

Trim Empty Bytes

似乎与 Wiktor 的评论相似。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 实际上,GetString 有一个需要计数的重载。所以只需将 pBuffer 和 N 传递给 GetString 的重载。
    • 你能帮我截断 pBuffer 数组吗?如何搜索缓冲区数组并创建一个新的,2 行代码将完成这项工作
    猜你喜欢
    • 2016-09-23
    • 2013-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-02
    相关资源
    最近更新 更多