public static LoginWithTokenEx Decode(string hex)
            {
                var auth      = new LoginWithTokenEx();
                int tokensize = (int.Parse(hex.Substring(0, 4).FromHex().Reverse().ToArray().ToHex(), System.Globalization.NumberStyles.HexNumber)) * 2;

                auth.Token = hex.Substring(4, tokensize);
                var data     = new RVConnectionData();
                int surlsize = (int.Parse(hex.Substring(4 + tokensize, 4).FromHex().Reverse().ToArray().ToHex(), System.Globalization.NumberStyles.HexNumber)) * 2;

                data.StationUrl = hex.Substring(8 + tokensize, surlsize);
                int spurlsize = (int.Parse(hex.Substring(surlsize + 8 + tokensize, 8).FromHex().Reverse().ToArray().ToHex(), System.Globalization.NumberStyles.HexNumber)) * 2;

                if (spurlsize != 0)
                {
                    data.SpecialProtocols = hex.Substring(surlsize + 16 + tokensize, spurlsize);
                }
                int surlsize2 = (int.Parse(hex.Substring(16 + surlsize + tokensize + spurlsize, 4).FromHex().Reverse().ToArray().ToHex(), System.Globalization.NumberStyles.HexNumber)) * 2;

                data.StationUrl2      = hex.Substring(20 + surlsize + tokensize + spurlsize, surlsize2);
                auth.RVConnectionData = data;
                int logindatalength = (int.Parse(hex.Substring(20 + surlsize + tokensize + spurlsize + surlsize2, 4).FromHex().Reverse().ToArray().ToHex(), System.Globalization.NumberStyles.HexNumber)) * 2;

                auth.LoginData = hex.Substring(24 + surlsize + tokensize + spurlsize + surlsize2, logindatalength);
                return(auth);
            }
        private void Handle(byte[] data, IPEndPoint endpoint)
        {
            var hex = data.ToHex();

            Console.WriteLine("Received: " + hex);
            if (hex.Equals("3f3120000000000000000000000034322000"))
            {
                //var packet = PRUdpPacket.Decode(data);
                var resp = "313f08000000000000000f8744db6a1b1887";
                //var packet1 = PRUdpPacket.Decode(resp.FromHex());
                Send(resp.FromHex(), endpoint);
            }
            else
            {
                var packet = PRUdpPacket.Decode(data);
                if (packet.Type == PacketTypes.PING)
                {
                    //todo, ping handling code
                }
                else if (packet.Type == PacketTypes.CONNECT)
                {
                    var response = new PRUdpPacket()
                    {
                        Flags               = new PacketFlags[] { PacketFlags.FLAG_ACK },
                        Type                = PacketTypes.CONNECT,
                        SessionId           = packet.SessionId,
                        Signature           = packet.Signature,
                        ConnectionSignature = packet.ConnectionSignature
                    };
                    var p = response.Encode();
                    Console.WriteLine("Sent: " + p.ToHex());
                    Send(p, endpoint);
                }
                else if (packet.Type == PacketTypes.DATA)
                {
                    var rvconndata = new RVConnectionData()
                    {
                        StationUrl = "prudps:/127.0.0.1:10264"
                    };
                    var rmc = new RMCPayload()
                    {
                        CallId     = packet.RMCPayload.CallId,
                        MethodId   = packet.RMCPayload.MethodId,
                        ProtocolId = packet.RMCPayload.ProtocolId,
                        Payload    = rvconndata.Encode()
                    };
                    var response = new PRUdpPacket()
                    {
                        Flags               = new PacketFlags[] { PacketFlags.FLAG_ACK, PacketFlags.FLAG_NEED_ACK },
                        Type                = PacketTypes.DATA,
                        SessionId           = packet.SessionId,
                        Signature           = packet.Signature,
                        Payload             = rmc.Encode(),
                        ConnectionSignature = packet.ConnectionSignature
                    };
                    var p = response.Encode().ToHex();
                    Console.WriteLine("Sent: " + p);
                    Send(p.FromHex(), endpoint);
                }
                else
                {
                    Console.WriteLine("Unknown packet: " + hex);
                }
            }
        }