python3的AMF序列化

2024-04-28 21:53:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图为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'

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

头解析正常,但当我到达第一个对象时(\n在第一行末尾附近),它被标记为引用(LSB=0),而它不能引用其他对象。在

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


Tags: 对象字节序列化编码器解码器python3x00amf
1条回答
网友
1楼 · 发布于 2024-04-28 21:53:27

AMF3 spec,部分4.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对象标记(0x11)时,才应切换到AMF3。因此,值中的0x0a类型标记实际上不是AMF3对象标记,而是AMF0严格数组标记。在

查看AMF0 spec中的2.12strict Array Type,我们可以看到这个类型被简单地定义为一个u32数组计数,然后是值类型的数量。在

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

在本例中,对象是一个实际的AMF3对象(类型marker0x0a),后面是一个非动态的U29O traits,有9个密封成员。但我相信你可以从这里拿走。:)

相关问题 更多 >