我试图为AMF写一个python3编码器/解码器。
我这样做的原因是因为我找不到适合python3的合适的库(我正在寻找一种非干扰性的库-一个可以为我提供方法并让我自己处理网关的库)
我为python测试的Avaialble库为amfast,pyamf和amfy。虽然前2个是针对python2的(pyamf的多个分支表明它们支持python3,但我无法使其正常工作),但amfy是为python3设计的,但缺少我需要的某些功能(特别是对象序列化)。
通读AMF0和AMF3的规范,我能够添加一个包编码器/解码器,但我偶然发现了对象序列化,并且可用的文档还不够(不愿看到一些示例)。现有的库也没有帮助。
通过使用remoteObject(在flex中),我设法将以下请求发送到解析器:
b'\x00\x03\x00\x00\x00\x01\x00\x04null\x00\x02/1\x00\x00\x00\xe0\n\x00\x00\x00\x01\x11
\n\x81\x13Mflex.messaging.messages.CommandMessage\x13operation\x1bcorrelationId\x13
timestamp\x11clientId\x15timeToLive\tbody\x0fheaders\x17destination\x13messageId\x04\x05
\x06\x01\x04\x00\x01\x04\x00\n\x0b\x01\x01\n\x05\tDSId\x06\x07nil%DSMessagingVersion\x04
\x01\x01\x06\x01\x06I03ACB769-9733-6A6C-0923-79F667AE8249'
(请注意,引入了换行符以使请求更具可读性)
头被解析好了,但是当我到达第一个对象(\ n在第一行的结尾附近)时,它被标记为引用(LSB = 0),而没有其他对象可以引用。
我读错了吗?这是格式错误的字节请求吗?
欢迎对这些字节进行解码的任何帮助。
最佳答案
在AMF3 spec的4.1 NetConnection和AMF3部分中:
此消息传递结构的格式为AMF 0(请参阅[AMF0]。上下文标头值或消息正文可以使用特殊的avmplus-object-marker类型切换为AMF 3编码。
这意味着默认情况下,邮件正文必须解析为AMF0。仅当遇到avmplus-object-marker(0x11)时,才应切换到AMF3。结果,您值中的0x0a
类型标记实际上不是AMF3对象标记,而是AMF0严格数组标记。
查看AMF0 spec中的2.12严格数组类型一节,我们可以看到此类型仅定义为u32数组计数,后跟该数量的值类型。
在您的数据中,array-count是0x00, 0x00, 0x00, 0x01
(即1),其后的值的类型标记为0x11-这是上面提到的avmplus-object-marker。因此,只有在开始解析AMF0数组内容之后,才应实际切换到AMF3来解析以下对象。
在这种情况下,该对象将是一个实际的AMF3对象(类型标记0x0a
),后跟具有9个密封成员的非动态U29O特征。但是我敢肯定,您可以从这里拿走它。 :)