2015-10-18 63 views
1

我想为AMF写一个python3编码器/解码器。AMF序列化为python3

我这样做的原因是因为我没有找到适用于python3的库(我正在寻找一个非强制性的库 - 一个将提供给我的方法,让我来处理网关我自己)

我测试python的Avaialble库是amfast,pyamf和amfy。虽然前两个是为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),而没有其他可引用的对象。

我看错了吗?这是一个畸形的字节请求? 解码这些字节的任何帮助都会受到欢迎。

回答

1

AMF3 spec,部分4.1 NetConnection和AMF3

此消息结构的格式是AMF 0(参见[AMF0]上下文头值或消息体可以切换到AMF 3编码。使用特殊的avmplus-对象标记类型。

这意味着,在默认情况下,消息正文必须被解析为AMF0。遇到你应该切换到AMF3一个的avmplus-对象标记(0×11)仅当因此,0x0a您的值中的类型标记实际上不是AMF3对象标记,而是AMF0严格数组标记。

寻找在AMF0 spec2.12严格阵列类型,我们可以看到,这种类型被简单地定义为U32阵列计数,随后该数字值类型。

在您的数据中,数组数为0x00, 0x00, 0x00, 0x01(即1),其后的值的类型标记为0x11--这是上面提到的avmplus-object-marker。因此,只有在开始解析AMF0阵列内容后,才能切换到AMF3来解析以下对象。

在这种情况下,对象然后是一个实际的AMF3对象(类型标记0x0a),其次是具有9个密封成员的非动态U29O特征。但我相信你可以从这里拿走它。 :)

+0

谢谢。无论我看到多少次,它都没有沉入...... – Ofir