6

私はここで私が間違っていることを理解しようとしています。バイナリリーダーを使用して、ストリームから最初の4バイトをInt32値に簡単に取得しようとしています。これにより、残りのデータが予想される期間がわかります。

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バイトの値と等しくなるまで続きます。このコードは、私が直面している問題を示すための単純化にすぎません。ストリームの位置は正しいようですが(4)、2から読み始めているようです。

4

1 に答える 1

8

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

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

于 2010-11-24T00:09:26.250 に答える