最近和我们公司的C#技术人员讨论话题,讨论到语言的时候我们打赌他用C#语言封装一下amf结构我用php语言
封装一下amf结构,
C#版本的已经有人做出来的,php的目前无济于世,本来自己想在网络上出一下名自己用php封装互联网上第一个php版本的amf协议,但研究了几天,由于水平有限没写出来,希望有朋友可以写出来第一个php版本的amf封装结构,为我们学php的朋友争一口气.

C#原文章地址为:http://vvcha.cn/c.aspx?id=20120  1. class amf_post_data  
   2.    {  
   3.        public list<byte> message;  
   4.   
   5.        /// <summary>  
   6.        /// 初始化message  
   7.        /// </summary>  
   8.        /// <param name="at"></param>  
   9.        /// <param name="headers"></param>  
  10.        /// <param name="bodies"></param>  
  11.        public amf_post_data(amftype at, int headers, int bodies)  
  12.        {  
  13.            //amf版本  
  14.            if (at == amftype.amf0)  
  15.            {  
  16.                message = new list<byte>(new byte[] { 0x00, 0x00 });  
  17.            }  
  18.            else if (at == amftype.amf3)  
  19.            {  
  20.                message = new list<byte>(new byte[] { 0x00, 0x03 });  
  21.            }  
  22.   
  23.            //header数量  
  24.            message.add(bitconverter.getbytes(headers)[1]);  
  25.            message.add(bitconverter.getbytes(headers)[0]);  
  26.            //body数量  
  27.            message.add(bitconverter.getbytes(bodies)[1]);  
  28.            message.add(bitconverter.getbytes(bodies)[0]);  
  29.        }  
  30.   
  31.        /// <summary>  
  32.        /// 添加target  
  33.        /// </summary>  
  34.        /// <param name="target"></param>  
  35.        /// <param name="response"></param>  
  36.        public void addtargetandresponse(string target, string response)  
  37.        {  
  38.            //添加target长度  
  39.            message.add(bitconverter.getbytes(target.length)[1]);  
  40.            message.add(bitconverter.getbytes(target.length)[0]);  
  41.            //添加target内容  
  42.            message.addrange(encoding.default.getbytes(target));  
  43.   
  44.            //添加response长度  
  45.            message.add(bitconverter.getbytes(response.length)[1]);  
  46.            message.add(bitconverter.getbytes(response.length)[0]);  
  47.            //添加response内容  
  48.            message.addrange(encoding.default.getbytes(response));  
  49.        }  
  50.   
  51.        /// <summary>  
  52.        /// 添加body  
  53.        /// </summary>  
  54.        /// <param name="length"></param>  
  55.        /// <param name="content"></param>  
  56.        public void addbody(amf_post_data_body apdb)  
  57.        {  
  58.            message.addrange(apdb.getlength());  
  59.            message.addrange(apdb.content.toarray());  
  60.        }  
  61.    }  
  62.   
  63.    class amf_post_data_body  
  64.    {  
  65.        private byte[] length = new byte[4];  
  66.        public list<byte> content = new list<byte>();  
  67.   
  68.        /// <summary>  
  69.        /// 初始化body  
  70.        /// </summary>  
  71.        /// <param name="dt"></param>  
  72.        /// <param name="arraylength"></param>  
  73.        public amf_post_data_body(datatype dt, int arraylength)  
  74.        {  
  75.            //添加类型标识  
  76.            content.add((byte)dt);  
  77.   
  78.            //数组的话添加长度  
  79.            if (dt == datatype.array)  
  80.            {  
  81.                content.add(bitconverter.getbytes(arraylength)[3]);  
  82.                content.add(bitconverter.getbytes(arraylength)[2]);  
  83.                content.add(bitconverter.getbytes(arraylength)[1]);  
  84.                content.add(bitconverter.getbytes(arraylength)[0]);  
  85.            }  
  86.        }  
  87.   
  88.        public void adddata(datatype dt, string value)  
  89.        {  
  90.            //添加类型标识  
  91.            content.add((byte)dt);  
  92.   
  93.            switch (dt)  
  94.            {  
  95.                case datatype.number:  
  96.                    adddata_number(double.parse(value));  
  97.                    break;  
  98.                case datatype.string:  
  99.                    adddata_string(value);  
 100.                    break;  
 101.                case datatype.boolean:  
 102.                    adddata_boolean(boolean.parse(value));  
 103.                    break;  
 104.            }  
 105.        }  
 106.  
 107.        #region 更种类型处理方法  
 108.        /// <summary>  
 109.        /// boolean  
 110.        /// </summary>  
 111.        /// <param name="p"></param>  
 112.        private void adddata_boolean(bool p)  
 113.        {  
 114.            if (p)  
 115.                content.add(0x01);  
 116.            else  
 117.                content.add(0x00);  
 118.        }  
 119.        /// <summary>  
 120.        /// string  
 121.        /// </summary>  
 122.        /// <param name="value"></param>  
 123.        private void adddata_string(string value)  
 124.        {  
 125.            //添加长度  
 126.            content.add(bitconverter.getbytes(value.length)[1]);  
 127.            content.add(bitconverter.getbytes(value.length)[0]);  
 128.            //添加内容  
 129.            content.addrange(encoding.default.getbytes(value));  
 130.        }  
 131.        /// <summary>  
 132.        /// number  
 133.        /// </summary>  
 134.        /// <param name="p"></param>  
 135.        private void adddata_number(double p)  
 136.        {  
 137.            byte[] b = new byte[8];  
 138.            b = bitconverter.getbytes(p);  
 139.            for (int i = 7; i > -1; i--)  
 140.            {  
 141.                content.add(b[i]);  
 142.            }  
 143.        }  
 144.        #endregion  
 145.   
 146.        public byte[] getlength()  
 147.        {  
 148.            length[0] = bitconverter.getbytes(content.count)[3];  
 149.            length[1] = bitconverter.getbytes(content.count)[2];  
 150.            length[2] = bitconverter.getbytes(content.count)[1];  
 151.            length[3] = bitconverter.getbytes(content.count)[0];  
 152.   
 153.            return length;  
 154.        }  
 155.    }  
 156.  
 157.    #region 类型枚举  
 158.    public enum amftype  
 159.    {  
 160.        amf0,  
 161.        amf3  
 162.    }  
 163.   
 164.    public enum datatype  
 165.    {  
 166.        number = 0,  
 167.        boolean = 1,  
 168.        string = 2,  
 169.        untypedobject = 3,  
 170.        movieclip = 4,  
 171.        null = 5,  
 172.        undefined = 6,  
 173.        referencedobject = 7,  
 174.        mixedarray = 8,  
 175.        end = 9,  
 176.        array = 10,//0x0a  
 177.        date = 11,//0x0b  
 178.        longstring = 12,//0x0c  
 179.        typeasobject = 13,//0x0d  
 180.        recordset = 14,//0x0e  
 181.        xml = 15,//0x0f  
 182.        typedobject = 16,//0x10  
 183.        amf3data = 17//0x11  
 184.    }  
 185.    #endregion  

解决方案 »

  1.   

    http://sourceforge.net/projects/amfphp/files/#files
      

  2.   

    能啊。。为什么不能。。
    泛型:http://topic.csdn.net/u/20100424/22/1f77a59f-7f55-49c8-bed5-408dd5aae52a.html?99370
    枚举什么的我也做好了
      

  3.   

    PHP - AMFPHP, SabreAMF, WebORB for PHP, Zend_Amf
    http://www.amfphp.org/
    http://osflash.org/sabreamf
    http://www.themidnightcoders.com/products/weborb-for-php
    http://framework.zend.com/manual/en/zend.amf.html来源: 维基百科
      

  4.   

    其实就是xml封装类一样, 只不过amf用来于flash通迅http://sourceforge.net/projects/amfphp/files/#files
      

  5.   

    谢谢大家,我想问一下把数据格式封装好了如果post啊?
      

  6.   

    请求网址为:http://index.baidu.com/gateway.php
    我抓取的包为如下图片,请问用php如何封装amf数据格式然后post啊?
      

  7.   

    晕倒上面的的图片显示不了麻烦各位访问这个网址看一下:
    http://91.images22.51img1.com/6000/renqiang_888/137d2bb61e4af869353a5df1e603fde7.jpg