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 6

1 ответ:

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

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