C# BinaryReader.Read () получает мусор, чтобы начать с

Я пытаюсь понять, что я делаю неправильно здесь. Я пытаюсь использовать двоичный считыватель, чтобы облегчить получение начальных четырех байтов из потока в значение 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));
}

выход должен быть входом, но я получаю это (Обратите внимание, что первый символ изменяется от строки к строке)

(представьте, что это очень длинная строка

может кто-нибудь мне объяснит что я делаю не так? В идеале второе чтение будет продолжаться до тех пор, пока общее число прочитанных байтов не будет равно значению первых четырех байтов.. этот код-просто упрощение, чтобы показать проблему, с которой я сталкиваюсь. Положение потока кажется правильным (4), но почти кажется, что он начинает читать в 2.

1 ответов


BinaryWriter.Write (String) записывает строку с префиксом длины в этот поток. Это означает, что он сначала записывает длину строки в поток, а затем строку, используя некоторую кодировку. Длина кодируются по семь бит, а не как 32-разрядное целое число.

Если вы хотите, чтобы читать из потока, вы должны использовать BinaryReader.Readstring далее, который считывает строку с префиксом длины из потока.