python3的AMF序列化

python3的AMF序列化,python,python-3.x,amf,Python,Python 3.x,Amf,我正在尝试为AMF编写python3编码器/解码器 我这么做的原因是因为我没有找到一个适用于python3的库(我正在寻找一个非突兀的库-一个可以为我提供方法并让我自己处理网关的库) 我为python测试的可用库有amfast、pyamf和amfy。前两个是python2(pyamf的几个分支建议它们支持python3,但我无法让它工作),amfy是为python3设计的,但缺少我需要的一些特性(特别是对象序列化) 通过阅读AMF0和AMF3的规范,我能够添加一个包编码器/解码器,但我偶然发现了

我正在尝试为AMF编写python3编码器/解码器

我这么做的原因是因为我没有找到一个适用于python3的库(我正在寻找一个非突兀的库-一个可以为我提供方法并让我自己处理网关的库)

我为python测试的可用库有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),而没有其他对象可以引用

我读错了吗?这是一个格式错误的字节请求吗? 欢迎提供解码这些字节的任何帮助。

来自第4.1节NetConnection和AMF3:

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

这意味着默认情况下,消息体必须解析为AMF0。只有在遇到avmplus对象标记(0x11)时,才应切换到AMF3。因此,值中的
0x0a
类型标记实际上不是AMF3对象标记,而是AMF0严格数组标记

查看中的第2.12节Strict Array Type,我们可以看到该类型仅定义为u32数组计数,后跟该数量的值类型

在您的数据中,数组计数是
0x00、0x00、0x00、0x01
(即1),后面的值有一个类型标记0x11,即上面提到的avmplus对象标记。因此,只有在开始解析AMF0数组内容之后,您才应该实际切换到AMF3来解析以下对象

在本例中,该对象是一个实际的AMF3对象(类型标记
0x0a
),后跟一个带有9个密封成员的非动态U29O特征。但我相信您可以从这里开始使用它。:)