C# 字节 [] 到字符串显示不要在“”之后剪切

本文关键字:之后 字节 显示 字符串 | 更新日期: 2023-09-27 18:32:52

我正在从内存中读取某些内容(在字节数组中),然后我想转换它,但结果类似于"wanteddata''0''0''0''0''0''0''0''0..."。如何将其剪切为"想要的数据"?我不确定想要的数据的大小,所以我给出了最大大小:14。我从内存中读取和转换的方式:

        String w="";
        ReadProcessMemory(phandle, bAddr, buffer, 14, out bytesRW);
        w = ASCIIEncoding.ASCII.GetString(buffer);

C# 字节 [] 到字符串显示不要在“�”之后剪切

大概,您想删除所有字符,包括第一个"''0"和之后的字符。 Trim不会这样做。你需要做这样的事情:

int i = w.IndexOf( ''0' );
if ( i >= 0 ) w = w.Substring( 0, i );

如果数组确实是 ascii(每个字符一个字节),您可以通过在数组中搜索值 0 来查找 null

String w="";
ReadProcessMemory(phandle, bAddr, buffer, 14, out bytesRW);
int nullIdx = Array.IndexOf(buffer, (byte)0);
nullIdx = nullIdx >= 0 ? nullIdx : buffer.Length;
w = ASCIIEncoding.ASCII.GetString(buffer, 0, nullIndex);

这种方法将在一定程度上优化代码,而不是创建包含多个 '/0 的字符串

您可以像以下代码一样使用 LINQ。

Encoding.ASCII.GetString(buffer.TakeWhile(x => x != 0).ToArray());

bytesRW 的值是复制到缓冲区的字节数,如此处所述。GetString 方法具有一个重载,该重载采用位置和长度。如果传递零作为位置,传递 bytesRW 作为长度,则应创建一个包含所需值的字符串。

根据 mortb 响应,我得到了:

public static class EncodingEx
{
    /// <summary>
    /// Convert a C char* to <see cref="string"/>.
    /// </summary>
    /// <param name="encoding">C char* encoding.</param>
    /// <param name="cString">C char* to convert.</param>
    /// <returns>The converted <see cref="string"/>.</returns>
    public static string ReadCString(this Encoding encoding, byte[] cString)
    {
        var nullIndex = Array.IndexOf(cString, (byte) 0);
        nullIndex = (nullIndex == -1) ? cString.Length : nullIndex;
        return encoding.GetString(cString, 0, nullIndex);
    }
}
...
// A call
Encoding.ASCII.ReadCString(buffer)

但是,对Array.IndexOf的呼唤是不同的。第二个参数必须是byte,事实上,0是一个int,不能在byte数组中找到。