2015-10-18 61 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