using System.IO; namespace BSO.Net { /// /// BinaryReader fuer Daten aus dem Netz (wie bei MSCO): jede Laengenangabe wird gegen die tatsaechlich vorhandenen /// Bytes geprueft - eine gefaelschte Laenge darf nicht zu einer riesigen Speicheranforderung fuehren. /// public sealed class PacketReader : BinaryReader { public PacketReader(byte[] data) : base(new MemoryStream(data ?? new byte[0], false)) { } long Remaining => BaseStream.Length - BaseStream.Position; public override byte[] ReadBytes(int count) { if (count < 0 || count > Remaining) throw new EndOfStreamException("Invalid length " + count); return base.ReadBytes(count); } public override char[] ReadChars(int count) { if (count < 0 || count > Remaining) throw new EndOfStreamException("Invalid length " + count); return base.ReadChars(count); } public override string ReadString() { long start = BaseStream.Position; int length = Read7BitEncodedInt(); if (length < 0 || length > Remaining) throw new EndOfStreamException("Invalid string length " + length); BaseStream.Position = start; return base.ReadString(); } } }