8

私はメモリ(バイト配列内)から何かを読んでから、それを変換したいのですが、結果は「wanteseddata \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 ...」のようなものです。どうすればそれを「wanteddata」にカットできますか?WantedDataが持っているサイズがわからないので、最大サイズを与えました。14。メモリから変換する方法:

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

5 に答える 5

12

おそらく、最初の '\0' を含むすべての文字を削除したいと考えています。Trimこれはしません。次のようなことをする必要があります:

int i = w.IndexOf( '\0' );
if ( i >= 0 ) w = w.Substring( 0, i );
于 2012-04-30T11:01:41.223 に答える
5

配列が実際に ascii (1 文字あたり 1 バイト) の場合は、配列で値 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' を含む文字列を作成するのではなく、コードをいくらか最適化します。

于 2012-04-30T12:08:53.640 に答える
2

bytesRW の値は、ここで説明されているように、バッファーにコピーされたバイト数です。GetString メソッドには、位置と長さを受け取るオーバーロードがあります。位置としてゼロを渡し、長さとして bytesRW を渡すと、必要な値を含む文字列が作成されます。

于 2012-04-30T11:06:10.393 に答える
1

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は異なります。2 番目の引数は である必要がありbyte、実際に0は であり、配列int内に見つかりません。byte

于 2014-04-10T15:32:23.560 に答える