/// <summary> /// Parses a packet. Returns false, if the packet can't be received. /// </summary> /// <param name="reader">Offset in the byte[] where we start to parse.</param> /// <returns>true, if the Packet could be parsed. false otherwise.</returns> public bool Parse(ref BinaryMemoryReader reader) { if (reader.Size <= 0) { return(false); } BinaryMemoryReader start = reader; byte header = reader.ReadByte(); int length; int packetLength; if ((header & 0b0011_0000) == 0b0011_0000) { OutOfBand = (byte)(header & 0b0000_1111); if (reader.Size < OutOfBand) { reader = start; return(false); } if (OutOfBand > 0) { reader.Jump(OutOfBand); } OutOfBand++; return(true); } // Theoretically we need to set this here, if packet classes will be re-used. // OutOfBand = 0; packetLength = (((header & 0b1000_0000) == 0b1000_0000) ? 1 : 0) + (((header & 0b0100_0000) == 0b0100_0000) ? 1 : 0) + (((header & 0b0000_1000) == 0b0000_1000) ? 2 : 0) + (((header & 0b0000_0100) == 0b0000_0100) ? 1 : 0) + (((header & 0b0000_0010) == 0b0000_0010) ? 4 : 0) + (((header & 0b0000_0001) == 0b0000_0001) ? 1 : 0); switch ((header & 0b0011_0000) >> 4) {
public unsafe void CutJumpLimits() { byte[] data; using (MemoryStream ms = new MemoryStream()) { using (BinaryWriter writer = new BinaryWriter(ms)) writer.Write(new byte[30]); data = ms.ToArray(); } fixed(byte *pData = data) { BinaryMemoryReader reader = new BinaryMemoryReader(pData, data.Length); BinaryMemoryReader cutReader = reader; try { cutReader = reader.Cut(31); Assert.Fail("Should have thrown an OutOfMemoryException."); } catch { } BinaryMemoryWriter writer = new BinaryMemoryWriter(pData, data.Length); try { cutReader.Jump(31); Assert.Fail("Should have thrown an OutOfMemoryException."); } catch { } } }