예제 #1
0
        public void ReadFromBitStream(ReadOnlyBitStream bitStream)
        {
            bool isBigEndian = bitStream.IsBigEndian();

            bitStream.SetBigEndian(true);

            version        = bitStream.ReadNibble();
            headerLength   = bitStream.ReadNibble();
            headerLength  *= 4;
            dsf            = bitStream.ReadByte();
            totalLength    = bitStream.ReadUInt16();
            identifier     = bitStream.ReadUInt16();
            flags          = bitStream.ReadUInt16();
            ttl            = bitStream.ReadByte();
            protocol       = bitStream.ReadByte();
            headerChecksum = bitStream.ReadUInt16();
            source         = bitStream.ReadBytes(4);
            destination    = bitStream.ReadBytes(4);

            bitStream.SetBigEndian(isBigEndian);

            if (protocol == 17)
            {
                datagram = new Datagram();
                datagram.ReadFromBitStream(bitStream);
            }
            else
            {
                bitStream.ReadBytes(totalLength - headerLength); // Skip if not UDP.
            }
        }
예제 #2
0
 public void ReadFromBitStream(ReadOnlyBitStream bitStream)
 {
     destination = bitStream.ReadBytes(6);
     source      = bitStream.ReadBytes(6);
     protocol    = bitStream.ReadUInt16();
     packet      = new Packet();
     packet.ReadFromBitStream(bitStream);
 }
예제 #3
0
        public void ReadFromBitStream(ReadOnlyBitStream bitStream)
        {
            bool isBigEndian = bitStream.IsBigEndian();

            bitStream.SetBigEndian(true);

            sourcePort      = bitStream.ReadUInt16();
            destinationPort = bitStream.ReadUInt16();
            totalLength     = bitStream.ReadUInt16();
            checksum        = bitStream.ReadUInt16();
            data            = bitStream.ReadBytes(totalLength - 8);

            bitStream.SetBigEndian(isBigEndian);
        }
예제 #4
0
        public void ReadFromBitStream(ReadOnlyBitStream bitStream)
        {
            header = new PacketHeader();
            header.ReadFromBitStream(bitStream);

            int position = bitStream.GetBitsRead() / 8;

            data = new Ethernet.Frame();
            data.ReadFromBitStream(bitStream);

            int dataSize   = bitStream.GetBitsRead() / 8 - position;
            int difference = (int)header.GetLength() - dataSize;

            bitStream.ReadBytes(difference); // Skip padding.
        }
예제 #5
0
 public void FromBitStream(ReadOnlyBitStream packetStream)
 {
     Username    = packetStream.ReadWideString(33);
     SessionKey  = packetStream.ReadWideString(33);
     FdbChecksum = packetStream.ReadBytes(33);
 }
예제 #6
0
        public string Read(ReadOnlyBitStream bitStream)
        {
            StringWriter output           = new StringWriter();
            uint         socketIdentifier = bitStream.ReadUInt32();
            bool         isHandshake      = socketIdentifier == 0;

            output.WriteLine("Is Handshake: " + isHandshake);
            output.WriteLine("Socket ID: " + socketIdentifier);

            if (isHandshake)
            {
                string messageIdentifier = "";

                for (int i = 0; i < 4; i++)
                {
                    messageIdentifier += (char)bitStream.ReadByte();
                }

                output.WriteLine("Message ID: " + messageIdentifier);

                if (handshakeStructs.ContainsKey(messageIdentifier))
                {
                    handshakeStructs[messageIdentifier].ReadFromBitStream(bitStream);
                    handshakeStructs[messageIdentifier].WriteToTextWriter(output);
                }
            }
            else
            {
                byte        channel     = bitStream.ReadCrumb();
                byte        resendCount = bitStream.ReadCrumb();
                bool        isSplit     = bitStream.ReadBit();
                Util.UInt11 length      = new Util.UInt11();

                length.ReadFromBitStream(bitStream);

                output.WriteLine("Channel: " + channel);
                output.WriteLine("Resend Count: " + resendCount);
                output.WriteLine("Is Split: " + isSplit);
                output.WriteLine("Length: " + length);

                if (channel == 0)
                {
                    byte messageIdentifier = bitStream.ReadByte();

                    output.Write("Message ID: " + messageIdentifier);

                    if (channel0Structs.ContainsKey(messageIdentifier))
                    {
                        Structure srct = channel0Structs[messageIdentifier];

                        output.WriteLine(" (" + srct.GetType().Name + ")");

                        srct.ReadFromBitStream(bitStream);
                        srct.WriteToTextWriter(output);
                    }
                }
            }

            if (bitStream.GetBitsUnread() > 0)
            {
                output.WriteLine();

                if (bitStream.GetBitsUnread() % 8 == 0)
                {
                    output.WriteLine("Unread Bytes:");
                    byte[] bytes = bitStream.ReadBytes(bitStream.GetBitsUnread() / 8);

                    for (int i = 0; i < bytes.Length; i++)
                    {
                        output.WriteLine(bytes[i]);
                    }
                }
                else
                {
                    output.WriteLine("Unread Bits:");

                    for (int i = 0; i < bitStream.GetBitsUnread(); i++)
                    {
                        output.WriteLine(bitStream.ReadBit() ? 1 : 0);
                    }
                }
            }

            return(output.ToString());
        }