예제 #1
0
        /// <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
                {
                }
            }
        }