最近和我们公司的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
封装一下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
泛型:http://topic.csdn.net/u/20100424/22/1f77a59f-7f55-49c8-bed5-408dd5aae52a.html?99370
枚举什么的我也做好了
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来源: 维基百科
我抓取的包为如下图片,请问用php如何封装amf数据格式然后post啊?
http://91.images22.51img1.com/6000/renqiang_888/137d2bb61e4af869353a5df1e603fde7.jpg