2010-11-24 5 views
6

私がここで間違っていることを理解しようとしています。私はバイナリリーダーを使用してストリームの最初の4バイトをInt32値に簡単に取得しようとしていますが、これは残りのデータがどれくらいの期間予想されるかを示しています。C#BinaryReader.Read()はじまりを開始します

static void Main(string[] args) 
{ 
    MemoryStream stream = new MemoryStream(); 

    BinaryWriter writer = new BinaryWriter(stream); 

    string s = "Imagine this is a very very long string."; 

    writer.Write(s.Length); 
    writer.Write(s); 
    writer.Flush(); 

    BinaryReader reader = new BinaryReader(stream); 
    reader.BaseStream.Seek(0, SeekOrigin.Begin); 

    char[] aChars = new char[reader.ReadInt32()]; 
    reader.Read(aChars, 0, aChars.Length); 
    Console.WriteLine(new string(aChars)); 
} 

出力は、入力する必要がありますが、私はこれを取得する(これは

非常に非常に長い文字列であると想像

(文字列への文字列の先頭文字があることに注意してください)

私が間違っていることを誰かに説明することはできますか?理想的には、2番目の読み込みは、読み込みバイトの合計が最初の4バイトの値に等しくなるまで継続します..このコードは、ストリームの位置はcorrのようですect(4)のようになりますが、ほとんどの場合2で読み始めているようです。

+0

MSDN、あなたはそれを読んでいます。 – jason

+0

Hehe、ありがとう...と私はいました。残念ながら、BinaryReaderは、Writerが文字列よりも文字列の余分なデータを格納しているとは言及していません;) – James

+0

'BinaryWriter.Write(string)': "長さの接頭辞' string'は、 'string'の前に'文字列 '' string'の長さを含む単一バイトまたは単語このメソッドはまず、 'string'の長さをUTF-7で符号化された符号なし整数として書き込み、次にその文字を' BinaryWriter'インスタンスの現在のエンコーディングです。 – jason

答えて

8

BinaryWriter.Write(String)このストリームには、プレフィックス付きの文字列が書き込まれます。 これは、最初に文字列の長さをストリームに書き込み、次に文字列を何らかのエンコーディングで書き込むことを意味します。長さは、32ビット整数ではなく、一度に7ビットずつエンコードされます。

ストリームから読み取る場合は、BinaryReader.ReadStringを使用する必要があります。これは、ストリームから長さプレフィックス付きの文字列を読み取ります。

+0

残りのデータが自動的に表示されるのを待ってから、最初にデータがストリームにない場合は自動的に表示されますか? – James

+0

最初に長さを書き込むだけでなく、長さは7ビットのエンコーディングで書き込まれます。したがって、128バイト未満の文字列は、1バイト長の接頭辞などを持ちます。 –

+0

@James:はい、データを待機します。 –

関連する問題