Exemple #1
0
        public RoomsEvent(byte[] body, TcpClient tcpClient)
        {
            this.tcpClient = tcpClient;
            int pos       = 0;
            int roomCount = Convert.ToInt32(body[pos++]);

            for (int i = 0; i < roomCount; i++)
            {
                int           roomId      = Convert.ToInt32(body[pos++]);
                int           memberCount = Convert.ToInt32(body[pos++]);
                List <Player> members     = new List <Player>();
                for (int memberIndex = 0; memberIndex < memberCount; memberIndex++)
                {
                    byte   userNameLen = body[pos++];
                    string userName    = BinUtil.BytesToString(body, pos, userNameLen);
                    pos += userNameLen;
                    var options = new byte[] { body[pos], body[pos + 1], body[pos + 2] };
                    pos += 3;
                    members.Add(new Player(userName, options));
                }

                byte battleType = body[pos++];
                byte num        = body[pos++];
                rooms.Add(new GameRoom(roomId, members, battleType, num));
            }
        }
Exemple #2
0
    public void crc32Test()
    {
        // Use the Assert class to test conditions
        Crc32  crc32 = new Crc32();
        string hash  = "";
        var    str   = BinUtil.StringToBytes("The quick brown fox jumps over the lazy dog");
        var    b     = crc32.ComputeHash(str);

        Console.WriteLine("CRC-32 is {0}", hash);
        Assert.AreEqual("414FA339", BinUtil.BytesToHexString(b));
    }
Exemple #3
0
        byte[] CreateHeader(string dataStr, int bodyLen)
        {
            byte[] data = new byte[12];
            magicNumber.CopyTo(data, 0);
            BinUtil.StringToBytes(dataStr).CopyTo(data, 2);
            var bodyLenByte = BitConverter.GetBytes(bodyLen);

            if (!BitConverter.IsLittleEndian)
            {
                Array.Reverse(bodyLenByte);
            }
            bodyLenByte.CopyTo(data, 8);
            return(data);
        }
Exemple #4
0
        public List <byte> GetBytes()
        {
            List <byte> body = new List <byte>();

            BinUtil.AddBytes(body, startFrame);
            body.Add(Convert.ToByte(bufferSize));
            body.Add(0);
            foreach (var action in actions)
            {
                body.Add(action);
            }

            return(body);
        }
Exemple #5
0
        /// <summary>
        /// Gets the raw IL instructions for this method.
        /// </summary>
        /// <returns>raw IL instructions</returns>
        public byte[] GetBody()
        {
            var fs = file.RawFile;

            fs.BaseStream.Seek(Offset, System.IO.SeekOrigin.Begin);

            byte format         = fs.ReadByte();
            int  CodeSize       = 0;
            var  verytinyheader = format.ConvertByteToBoolArray();


            var header = BinUtil.ConvertBoolArrayToByte(new bool[] { verytinyheader[6], verytinyheader[7] });

            var sizer = BinUtil.ConvertBoolArrayToByte(new bool[] { verytinyheader[0], verytinyheader[1], verytinyheader[2], verytinyheader[3], verytinyheader[4], verytinyheader[5], });

            fs.BaseStream.Seek(Offset + 1, System.IO.SeekOrigin.Begin);
            byte form2 = fs.ReadByte();

            fs.BaseStream.Seek(Offset + 1, System.IO.SeekOrigin.Begin);

            if (header == 3)                     //Fat format
            {
                byte   info2    = fs.ReadByte(); //some info on header
                ushort MaxStack = fs.ReadUInt16();
                CodeSize = (int)fs.ReadUInt32();
                uint LocalVarSigTok = fs.ReadUInt32();
            }
            else //Tiny format
            {
                CodeSize = sizer;
            }
            List <byte> code = new List <byte>();

            for (uint i = Offset + 1; i < Offset + 1 + CodeSize; i++)
            {
                byte opcode = fs.ReadByte();

                code.Add(opcode);
            }

            return(code.ToArray());
        }
Exemple #6
0
        public IServerEvent ReadAndParse(TcpClient client)
        {
            TcpConnector connector = client.Connector;

            byte[] header      = new byte[16];
            int    receiveSize = connector.Receive(header);

            if (receiveSize <= 0)
            {
                return(new ConnectionCloseEvent(connector));
            }
            // magicの照合
            bool isMagicCorrect = header.Take(2).SequenceEqual(magicNumber);

            if (!isMagicCorrect)
            {
                return(new UnknownEvent("Invalid magic."));
            }
            // bodyの取得
            var bodyLen = BitConverter.ToUInt32(header, 8);

            byte[] body = new byte[bodyLen];
            connector.Receive(body);
            // hash magicの照合
            var hashMagicBytes     = hashAlgorithm.ComputeHash(body.Concat(header).ToArray());
            var hashMagic          = BitConverter.ToUInt32(hashMagicBytes.Reverse().ToArray(), 0);
            var isHashMagicCorrect = hashMagic == this.hashMagic;

            if (!isHashMagicCorrect)
            {
                return(new UnknownEvent("Invalid hash algorithm magic."));
            }
            // event名の取得
            var          eventName = BinUtil.BytesToString(header.Skip(2).Take(6).ToArray());
            IServerEvent serverEvent;

            switch (eventName)
            {
            case "WELCOM":
                serverEvent = new WelcomeEvent();
                break;

            case "ROOMS ":
                serverEvent = new RoomsEvent(body, client);
                break;

            case "1ROOM ":
                serverEvent = new Room1Event(body);
                break;

            case "ROOMDL":
                serverEvent = new RoomDeleteEvent();
                break;

            case "PING  ":
                serverEvent = new PingEvent(body);
                break;

            case "START ":
                serverEvent = new StartEvent(body);
                break;

            case "READY ":
                serverEvent = new ReadyEvent(body);
                break;

            case "OKAY  ":
                serverEvent = new OkEvent(body);
                break;

            case "PLAY  ":
                serverEvent = new PlayEvent(body);
                break;

            case "ACTION":
                serverEvent = new ActionEvent(body);
                break;

            case "FINISH":
                serverEvent = new FinishEvent();
                break;

            case "ERROR!":
                serverEvent = new ErrorEvent();
                break;

            default:
                serverEvent = new UnknownEvent("Unknown event received");
                break;
            }

            return(serverEvent);
        }