• AMF入门教程


    解释AMF数据可以采用FluorineFx.AMF3这个包,方法如下。 

    FluorineFx.AMF3.ByteArray br = new FluorineFx.AMF3.ByteArray(new MemoryStream(bb));   
    br.Position = 0;   
    br.ReadShort();//amf版本   
    br.ReadShort();//header数量   
    br.ReadShort();//body数量   
    br.ReadUTFBytes((uint)(br.ReadShort()));//target长度和字符串   
    br.ReadUTFBytes((uint)(br.ReadShort()));//Response长度和字符串   
    br.ReadInt();//body长度   
    br.ReadByte();//body类型   
    object o = br.ReadObject();

    使用C# 模拟客户端请求,AMF请求 封包。 

    class AMF_Post_Data 
        { 
            public List<byte> message; 
     
            /// <summary> 
            /// 初始化Message 
            /// </summary> 
            /// <param name="at"></param> 
            /// <param name="headers"></param> 
            /// <param name="bodies"></param> 
            public AMF_Post_Data(AMFType at, int headers, int bodies) 
            { 
                //AMF版本 
                if (at == AMFType.AMF0) 
                { 
                    message = new List<byte>(new byte[] { 0x00, 0x00 }); 
                } 
                else if (at == AMFType.AMF3) 
                { 
                    message = new List<byte>(new byte[] { 0x00, 0x03 }); 
                } 
     
                //header数量 
                message.Add(BitConverter.GetBytes(headers)[1]); 
                message.Add(BitConverter.GetBytes(headers)[0]); 
                //body数量 
                message.Add(BitConverter.GetBytes(bodies)[1]); 
                message.Add(BitConverter.GetBytes(bodies)[0]); 
            } 
     
            /// <summary> 
            /// 添加Target 
            /// </summary> 
            /// <param name="target"></param> 
            /// <param name="Response"></param> 
            public void AddTargetAndResponse(string target, string Response) 
            { 
                //添加Target长度 
                message.Add(BitConverter.GetBytes(target.Length)[1]); 
                message.Add(BitConverter.GetBytes(target.Length)[0]); 
                //添加Target内容 
                message.AddRange(Encoding.Default.GetBytes(target)); 
     
                //添加Response长度 
                message.Add(BitConverter.GetBytes(Response.Length)[1]); 
                message.Add(BitConverter.GetBytes(Response.Length)[0]); 
                //添加Response内容 
                message.AddRange(Encoding.Default.GetBytes(Response)); 
            } 
     
            /// <summary> 
            /// 添加Body 
            /// </summary> 
            /// <param name="length"></param> 
            /// <param name="Content"></param> 
            public void AddBody(AMF_Post_Data_Body apdb) 
            { 
                message.AddRange(apdb.getLength()); 
                message.AddRange(apdb.Content.ToArray()); 
            } 
        } 
     
        class AMF_Post_Data_Body 
        { 
            private byte[] length = new byte[4]; 
            public List<byte> Content = new List<byte>(); 
     
            /// <summary> 
            /// 初始化Body 
            /// </summary> 
            /// <param name="dt"></param> 
            /// <param name="ArrayLength"></param> 
            public AMF_Post_Data_Body(DataType dt, int ArrayLength) 
            { 
                //添加类型标识 
                Content.Add((byte)dt); 
     
                //数组的话添加长度 
                if (dt == DataType.Array) 
                { 
                    Content.Add(BitConverter.GetBytes(ArrayLength)[3]); 
                    Content.Add(BitConverter.GetBytes(ArrayLength)[2]); 
                    Content.Add(BitConverter.GetBytes(ArrayLength)[1]); 
                    Content.Add(BitConverter.GetBytes(ArrayLength)[0]); 
                } 
            } 
     
            public void AddData(DataType dt, string value) 
            { 
                //添加类型标识 
                Content.Add((byte)dt); 
     
                switch (dt) 
                { 
                    case DataType.Number: 
                        AddData_Number(double.Parse(value)); 
                        break; 
                    case DataType.String: 
                        AddData_String(value); 
                        break; 
                    case DataType.Boolean: 
                        AddData_Boolean(Boolean.Parse(value)); 
                        break; 
                } 
            } 
     
            #region 更种类型处理方法 
            /// <summary> 
            /// Boolean 
            /// </summary> 
            /// <param name="p"></param> 
            private void AddData_Boolean(bool p) 
            { 
                if (p) 
                    Content.Add(0x01); 
                else 
                    Content.Add(0x00); 
            } 
            /// <summary> 
            /// String 
            /// </summary> 
            /// <param name="value"></param> 
            private void AddData_String(string value) 
            { 
                //添加长度 
                Content.Add(BitConverter.GetBytes(value.Length)[1]); 
                Content.Add(BitConverter.GetBytes(value.Length)[0]); 
                //添加内容 
                Content.AddRange(Encoding.Default.GetBytes(value)); 
            } 
            /// <summary> 
            /// Number 
            /// </summary> 
            /// <param name="p"></param> 
            private void AddData_Number(double p) 
            { 
                byte[] b = new byte[8]; 
                b = BitConverter.GetBytes(p); 
                for (int i = 7; i > -1; i--) 
                { 
                    Content.Add(b); 
                } 
            } 
            #endregion 
     
            public byte[] getLength() 
            { 
                length[0] = BitConverter.GetBytes(Content.Count)[3]; 
                length[1] = BitConverter.GetBytes(Content.Count)[2]; 
                length[2] = BitConverter.GetBytes(Content.Count)[1]; 
                length[3] = BitConverter.GetBytes(Content.Count)[0]; 
     
                return length; 
            } 
        } 
     
        #region 类型枚举 
        public enum AMFType 
        { 
            AMF0, 
            AMF3 
        } 
     
        public enum DataType 
        { 
            Number = 0, 
            Boolean = 1, 
            String = 2, 
            UntypedObject = 3, 
            MovieClip = 4, 
            Null = 5, 
            Undefined = 6, 
            ReferencedObject = 7, 
            MixedArray = 8, 
            End = 9, 
            Array = 10,//0x0A 
            Date = 11,//0x0B 
            LongString = 12,//0x0C 
            TypeAsObject = 13,//0x0D 
            Recordset = 14,//0x0E 
            Xml = 15,//0x0F 
            TypedObject = 16,//0x10 
            AMF3data = 17//0x11 
        } 
        #endregion
  • 相关阅读:
    sh_02_判断年龄改进版
    面向对象-内置函数和内置方法
    python面向对象-三大特性
    面向对象编程
    面向对象编程-回合制游戏
    练习Dream-购物车
    bytes和str的区别与转换
    字符串的操作和使用方法。
    程序员必须掌握的600个单词
    移动端的网页设计流程有哪些?
  • 原文地址:https://www.cnblogs.com/leeairw/p/2866812.html
Copyright © 2020-2023  润新知