예제 #1
0
        public static void TestBitWriting()
        {
            try
            {
                Random    rng       = new Random();
                const int size      = 1000;
                byte[]    byteArray = new byte[size];

                for (int i = 0; i < size; ++i)
                {
                    byteArray[i] = ((byte)rng.Next(0, 255));
                }

                int             currentBit = 0;
                int             totalBits  = byteArray.Count() * 8;
                BitWriterDeluxe writer     = new BitWriterDeluxe();

                while (currentBit < totalBits)
                {
                    int addition = Math.Min(totalBits - currentBit, rng.Next(1, 100));
                    int newIndex = currentBit + addition;
                    writer.WriteRangeFromArray(byteArray, currentBit, newIndex);
                    currentBit = newIndex;
                }

                var results = writer.Data;

                for (int i = 0; i < byteArray.Count(); ++i)
                {
                    if (results[i] != byteArray[i])
                    {
                        throw new Exception(string.Format("{0} = {1} on index {2}", results[i], byteArray[i], i));
                    }
                }

                Console.WriteLine("Copying succeeded.");
                Console.WriteLine("Size comparison {0} = {1}", byteArray.Count(), results.Count());
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
            Console.ReadLine();
        }
예제 #2
0
        public void Parse()
        {
            try
            {
                int type = 0;
                var bb   = new BitBuffer(Data);
                while (bb.BitsLeft > NetMessageBits && !ShouldStop)
                {
                    var dataBitWriter        = new BitWriterDeluxe();
                    var withoutTypeBitWriter = new BitWriterDeluxe();
                    int startIndex           = bb.CurrentBit;

                    type = (int)bb.ReadUnsignedBits(NetMessageBits);
                    MessageTypeRead?.Invoke(this, new MessageReceivedEventArgs(type, bb));
                    int withoutTypeIndex = bb.CurrentBit;

                    MsgHandler handler;
                    if (Handlers.TryGetValue((uint)type, out handler))
                    {
                        handler(bb);
                        dataBitWriter.WriteRangeFromArray(Data, startIndex, bb.CurrentBit);
                        withoutTypeBitWriter.WriteRangeFromArray(Data, withoutTypeIndex, bb.CurrentBit);

                        var bytes  = dataBitWriter.Data;
                        var bytes2 = withoutTypeBitWriter.Data;
                        MessageRead?.Invoke(this, new DataReadEventArgs(bytes, dataBitWriter, bytes2, withoutTypeBitWriter, type));
                    }
                    else
                    {
                        throw new Exception("Unknown packet type found.");
                    }
                }

                PacketSuccessfullyRead?.Invoke(this, new EventArgs());
            }
            catch (Exception e)
            {
                ExceptionThrown?.Invoke(this, new ExceptionEventArgs(e));
            }
        }