using System.IO; namespace MSCO { /// /// BinaryReader für Daten aus dem Netz (Server, Mitspieler). Mono legt bei ReadBytes(n) und ReadString() vorab ein /// Array bzw. einen StringBuilder in der angegebenen Länge an - eine gefälschte Länge (z.B. 2 Milliarden) ließ das /// Spiel mit "Out of Memory" abstürzen. Hier wird jede Länge gegen die tatsächlich vorhandenen Bytes geprüft. /// public sealed class PacketReader : BinaryReader { public PacketReader(byte[] data) : base(new MemoryStream(data ?? new byte[0], false)) { } long Remaining { get { return 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(); } } }