AMF 格式分析

1解析打包後的數據頭部

00000000  00 03 00 00 00 01 00 1d 45 78 61 6d 70 6c 65 53           ExampleS
00000010  65 72 76 69 63 65 2f 72 65 74 75 72 6e 4f 6e 65   ervice/returnOne
00000020  50 61 72 61 6d 00 02 2f 31 00 00 00 3d 0a 00 00   Param  /1   =  
00000030  00 01 11 0a 0b 0d 6d 79 54 79 70 65 11 61 72 72         myType arr
00000040  61 79 56 61 6c 09 07 01 04 01 04 02 06 07 65 72   ayVal         er
00000050  74 13 73 74 72 69 6e 67 56 61 6c 06 07 62 6c 61   t stringVal  bla
00000060  0d 69 6e 74 56 61 6c 04 02                        intVal
  1. 兩個字節的版本標記:00 03,也多是 00 00,BE 編碼。
  2. 兩個字節的頭部小節數量:00 00 ,BE編碼。若是不爲00,則後面跟具體的頭部小節信息。這裏爲0,每一個小節的格式爲:
    [小節名稱:[16位BE編碼長度][UTF-8編碼字符串內容]][8位布爾值, must-understand 標記][32位BE編碼小節長度][AMF 0 值]
  3. 兩個字節的消息內容數據數量:00 01,BE編碼。這裏 00 01 轉換後的結果就是 1,也就是說這個頭部代表有 1 個數據結點。接下來是多個數據體列表,每一個數據體的格式以下:
    (1)、請求的目標服務名稱:[16位BE編碼字符串長度][UTF-8編碼字符串內容];
    (2)、服務響應名稱:[16位BE編碼字符串長度][UTF-8編碼字符串內容];
    如上面請求的目標服務名稱部分爲:00 1d 45 78 61 6d 70 6c 65 53 65 72 76 69 63 65 2f 72 65 74 75 72 6e 4f 6e 65 50 61 72 61 6d,00 1d 就是名稱的長度 29,後面 29 個 UTF-8 編碼的字符構成實際的值:ExampleService/returnOneParam。同理,後面的響應名稱 00 02 2f 31 對應的是長度爲 2 字節的字符串 /1。
    (3)、32位BE編碼的的數據體長度 00 00 00 3d ,也就是說本數據體佔用的空間是 61 字節。
    (4)、AMF 0 格式的數據體內容。

這裏注意一個問題,AMF 數據打包是按照 AMF 0 標準來打包的,因此雖然頭部版本號是 00 03,頭部和消息的數據體依然是默認按 AMF 0 來開始解析,直到你遇到了類型爲 11 (十進制 17 )的類型標記,以它標記的數據纔是 AMF 3 格式的。咱們以上面的數據內容作一下人工解析: 數組

0a 00 00 00 01 11 0a 0b 0d 6d 79 54 79 70 65 11 61 72 72 61 79 56 61 6c 09 07 01 04 01 04 02 06 07 65 72 74 13 73 74 72 69 6e 67 56 61 6c 06 07 62 6c 61 0d 69 6e 74 56 61 6c 04 02
  • 0a :AMF 0 數組(10)
    • 00 00 00 01 :數組元素數量爲 1 ;
    • 11 :切換成 AMF 3 對象(17)
      • 0a :自身類型爲 AMF 3 對象(10)
      • 0b:一個 AMF 3 整數類型,用於作對象標誌位(11,二進制 1011:[類型屬性數量:25位][動態類型標誌][外部類型標誌][內置類聲明標誌][內置對象標誌]),這是一個動態、內置類聲明的動態類型。剩下的位數爲0,因此這個類型沒有子類型屬性。若是有,則根據 AMF3 的字符串規則,讀取每個屬性名稱字符串。
      • 0d:一個 AMF 3 整數類型,用於作類型名稱長度(13,根據AMF 3 字符串規則,實際長度爲 6 字節)
      • 6d 79 54 79 70 65:UTF-8 編碼的類型名稱(myType)
      • 11 61 72 72 61 79 56 61 6c :屬性名稱的 AMF 3 字符串(arrayVal)
        • 09:arrayVal 屬性的值類型爲 AMF 3 數組
        • 07:一個 AMF 3 整數類型,用於作數組標誌位,最低位是數組是否內置標誌,剩下的是實際的普通數組元素個數(3),用字符串作鍵值的數組元素不在此列。
        • 01:數組元素的鍵值爲 0 長度的 AMF 3 字符串(低位是引用標誌位),若是不爲0,須要循環讀取直到內容字符串內容爲空。
        • 04 01:元素類型爲整數值 01
        • 04 02:元素類型爲整數值 02
        • 06 07 65 72 74:AMF3 字符串 ert(後面再也不詳解)
      • 13 73 74 72 69 6e 67 56 61 6c:屬性名稱爲 AMF 3 字符串 stringVal
        • 06 07 62 6c 61 :AMF 3 字符串 bla
      • 0d 69 6e 74 56 61 6c:屬性名稱爲 AMF 3 字符串 intVal
        • 04 02 :元素內容爲整數值 0二、

2基本數據類型

AMF 格式的數據類型分爲兩種,一種是 AMF 0 規定的數據類型,另外一種就是 AMF 3 規定的數據類型。它們之間是經過 AMF0 中一個特殊的類型 0x11 (類型編碼爲 17)來進行轉換的。也就是說,在按 AMF 0 解析內容時,若是遇到類型的編碼爲 0x11 的項目,那就說明這個項目是 AMF3 格式的對象了,咱們須要按 AMF 3 格式對其內容進行解析。編碼

先看 AMF 0 的數據類型( 2006 版):spa

  • 0 :布爾類型,1 表明真,0 表明假;
  • 1 :雙精度浮點數,格式爲標準的Doube類型的 BE 編碼表示,咱們用時須要轉換字節度;
  • 2 :短字符串,最長是65535字節;前兩個字節是一個16 位 BE 編碼的整數,表明後面的 UTF-8 字符串內容的長度。
  • 3:對象
  • 4:視頻剪輯
  • 5:NULL
  • 6:未定義
  • 7:引用
  • 8:混合數組
  • 9:對象結束
  • 10:普通數組
  • 11:日期時間
  • 12:長UTF-8字符串,頭32位整數表明字符串長度
  • 13:Action Script 對象
  • 14:數據集
  • 15:XML 字符串
  • 16:用戶定義類型
  • 17:AMF 3 格式對象

再看 AMF 3 的類型( 2013 版):3d

  • 0:未定義
  • 1:NULL
  • 2:假
  • 3:真
  • 4:最大 29 位整數(U29)
  • 5:雙精度浮點數
  • 6:UTF-8字符串,以一個U29整數來表示字符串長度,後跟內容
  • 7:XML 文檔
  • 8:日期時間類型
  • 9:數組
  • 10:對象
  • XML:XML 字符串
  • 12:字節流
  • 13:整型向量
  • 14:無符號整數向量
  • 15:雙精度浮點數向量
  • 16:對象向量
  • 17:字典

爲啥 AMF3 會有兩個 XML 支持,這個問 Adobe 去,反正不是我規定的。每一個 AMF 格式的數據實際上都是有一個一個字節的類型標誌開始,後跟這個類型格式約定的具體值。code

3數據類型存貯格式詳解

一、雙精度浮點數視頻

類型編號:0對象

格式:IEEE-754 的8字節 BE 編碼索引

二、布爾ip

類型編號:1文檔

格式:單字節

備註:0 爲 false,其它值爲 true

三、字符串

類型編號:2

格式:[字符串長度][字符串內容]

備註:字符串長度爲兩個字節的 WORD 類型(BE編碼),字符串內容是 UTF-8 編碼

四、對象類型

類型編號:3

格式:[[屬性名稱][對象結束類型標記|屬性值]]…

備註:首先是第一個屬性的名稱,而後是屬性的值或者對象結束標記(09),若是遇到對象結束標記,則對象屬性定義結束。

五、視頻剪輯

類型編號:4

格式:官方未提供支持

六、NULL 類型

類型編號:5

格式:無附加內容

七、未定義類型(Undefined)

類型編號:6

格式:無附加內容

八、引用類型

類型編號:7

格式:引用的複合類型索引(匿名對象、特定類型對象、數組或混合數組,BE編碼)

九、複合數組

類型編號:8

格式:[元素數量][元素*元素數量]

備註:元素數量爲32位無符號整數,後面跟每個元素的定義

十、對象結束

類型編號:9

格式:00 00

備註:能夠認爲是長度爲 0 的 UTF8 字符串,應用於對象和數組等複合類型

十一、嚴格數組

類型編號:10

格式:[元素數量][元素*元素數量]

備註:元素數量爲 32 位無符號整數,後面跟每一個元素的定義,與複合數組不一樣,它沒有額外的索引內容

十二、日期類型

類型編號:11

格式:[日期值][00 00]

備註:日期值爲1970-1-1 午夜開始的毫秒數,類型爲雙精度浮點數(BE 編碼)

1三、長字符串

類型編號:12

格式:[字符串長度][字符串內容]

備註:字符串長度爲 32 位整數,後跟對應長度的 UTF-8 字符串內容

1四、不支持的類型

類型編號:13

格式:官方未提供支持

1五、數據集類型

類型編號:14

格式:官方未提供支持

1六、XML

類型編號:15

格式:[內容長度][內容]

備註:內容長度爲 32 位整數,後跟對應長度的 UTF-8 格式內容

1七、特定類型對象

類型編號:16

格式:[類型名稱][對象類型-對象值]*

備註:

1八、AMF 3 對象

類型編號:17

格式:[AMF 3 數據類型定義]

備註:這個類型定義到對象類型定義結束,都是 AMF 3 格式。

相關文章
相關標籤/搜索