2012-04-30 10 views
3

私はメモリから(バイト配列で)何かを読んでいるが、変換したいが、結果は "wanteddata \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 ... "となります。どのように私は "wantdata"にそれをカットすることができますか?私はwanteddataがありますサイズのわからないので、私は最大の大き与えた:14 私はメモリから読み込まれ、変換する方法を:C#byte [] to ' 0'の後に切り詰められないことを示す文字列

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

C#はCではありません - '\ 0'は文字列ターミネータではありません。 – Oded

+0

また、ソースが本当にASCIIかどうか、またはANSIまたはUTF8が正しい選択かどうかを確認する必要があります。 – CodesInChaos

答えて

9

おそらく、あなたは」を含む最初の後に、すべての文字を削除したいです\ 0 'となります。 Trimはこれを行いません。あなたはこのような何かを実行する必要があります。

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

文字列を作成する前に最初のヌルターミネータを見つける方が良いでしょうか?配列が本当にascii(charごとに1バイト)の場合、配列0から値0を検索することでnullを見つけることができます。 文字列w = ""; ReadProcessMemory(phandle、bAddr、buffer、14、out bytesRW); int nullIdx = Array.IndexOf(buffer、0); w = ASCIIEncoding.ASCII.GetString(buffer、0、nullIndex); – mortb

+0

@mortbこれも完璧です。回答として投稿するのはどうですか? – CodesInChaos

2

bytesRWの値がバッファas stated hereにコピーされたバイト数です。 GetStringメソッドには、位置と長さをとるオーバーロードがあります。あなたの位置にゼロを渡し、長さとしてbytesRWを渡す場合は、必要な値を含む文字列を作成する必要があります。

+0

これは本当に彼を助けるものではありません。なぜなら、 'ReadProcessMemory'は単にcstringの終わりに達したため停止しないからです。もちろん、 'bytesRW'をチェックするのは良いスタイルですが、具体的な問題は解決しません。 – CodesInChaos

3

配列が本当にASCII(文字あたり1バイト)である場合、あなたは0

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

このアプローチを値の配列を検索することによって、ヌル見つけることができますが、多少、複数の「を含む文字列を作成していない、コードを最適化します/ 0の

+0

Nicholasのように、 'nullIdx == -1'の場合を扱うべきでしょう。 – CodesInChaos

+0

@CodeInChaos:チェックを追加 – mortb

0

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である必要があります。実際、0intであり、byte配列には見つかりません。

関連する問題