python - python3 的 AMF 序列化

标签 python python-3.x amf

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

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

我测试的 python 可用库有 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'

(请注意,引入换行符是为了使请求更具可读性)

header 解析正常,但是当我到达第一个对象(\n 靠近第一行末尾)时,它被标记为引用(LSB = 0),而没有其他对象可以引用。

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

最佳答案

来自AMF3 spec4.1 NetConnection 和 AMF3 部分:

The format of this messaging structure is AMF 0 (See [AMF0]. A context header value or message body can switch to AMF 3 encoding using the special avmplus-object-marker type.

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

查看 AMF0 spec 中的2.12 严格数组类型部分,我们可以看到这个类型被简单地定义为一个 u32 数组计数,后面跟着数值类型的数量。

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

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

关于python - python3 的 AMF 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33198138/

相关文章:

python - 如何在默认为类级别值的 Python 方法中使用命名参数?

java - 有人成功使用 JPype 加载 Netflix 光子类吗?

python - 从字符串解析 graph_def 时出错

Java AMF 序列化

java - 如何用JAVA解析flash cookies(.SOL文件)

Python,要 float 的负数字符串

python - 从 python 脚本执行机器人框架文件

python - 如何获取 Python 日期时间对象自 1970 年 1 月 1 日以来的秒数?

python - 比较两个字符串中的字符,无论其位置如何

ruby - 如何在 Ruby 中解析 A​​MF 数据?