37 lines
1.3 KiB
C#
37 lines
1.3 KiB
C#
using System.IO;
|
|
|
|
namespace BSO.Net
|
|
{
|
|
/// <summary>
|
|
/// 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.
|
|
/// </summary>
|
|
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();
|
|
}
|
|
}
|
|
}
|