2012-07-29 9 views
5

私はバイナリファイルから文字列を読みます。各文字列はNULLで終了します。エンコーディングはUTF-8です。 Pythonでは、単にバイトを読み取り、0かどうかを確認してバイト配列に追加し、0を見るまでバイトの読み込みを続けます。バイト配列を文字列に変換して移動します。すべての文字列が正しく読み取られました。ヌルで終わる文字列を読む

これをC#でどのように読むことができますか?配列が固定サイズなので、単純に配列にバイトを追加するという贅沢はないと思います。

+1

を? –

+0

なぜそれらを文字列としてcharsとして追加しないのですか? – zellio

+0

これはうまくいくかもしれませんが、あなたが考えるよりも多くのメモリを使います。 C#の文字列は不変なので、新しい文字列を作成するたびに新しい文字列を作成する必要があります。余分なメモリの量はほとんどの場合問題ではないかもしれませんが、最良の方法はおそらくマイクの提案であり、分かりやすい初期サイズです。リストはまだ配列の周りのラッパーであり、必要に応じてより大きな配列を作成します。 – TheEvilPenguin

答えて

4

あなたはList<byte>を使用することができ、次のいずれか

List<byte> list = new List<byte>(); 
while(reading){ //or whatever your condition is 
    list.add(readByte); 
} 

string output = Encoding.UTF8.GetString(list.ToArray()); 

それともStringBuilderを使用することができます。

StringBuilder builder = new StringBuilder(); 

while(reading){ 
    builder.Append(readByte); 
} 

string output = builder.ToString(); 
+3

-1:StringBuilderは、バイトの文字値ではなく、代わりにバイトの整数値を[追加](http://msdn.microsoft.com/en-us/library/86yy043k.aspx)しません。 – Virtlink

6

あなたが探しているものを取得する必要があります後。テキストはすべてmyTextリスト内にある必要があります。

var data = File.ReadAllBytes("myfile.bin"); 
List<string> myText = new List<string>(); 
int lastOffset = 0; 
for (int i = 0; i < data.Length; i++) 
{ 
    if (data[i] == 0) 
    { 
     myText.Add(System.Text.Encoding.UTF8.GetString(data, lastOffset, i - lastOffset)); 
     lastOffset = i + 1; 
    } 
} 
+0

これが答えになるはずです –

3

私はあなたのStreamReaderインスタンス使用していると仮定:リスト を使用しないのはなぜ

StringBuilder sb = new StringBuilder(); 
using(StreamReader rdr = OpenReader(...)) { 
    Int32 nc; 
    while((nc = rdr.Read()) != -1) { 
      Char c = (Char)nc; 
      if(c != '\0') sb.Append(c); 
    } 
} 
関連する問題