C # BinaryReader.Read () получает мусор, чтобы начать с - PullRequest
6 голосов
/ 24 ноября 2010

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

8 голосов
/ 24 ноября 2010

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

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

...