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 , который считывает строку с префиксом длины из потока.