官方文档https://wwwimages2.adobe.com/content/dam/acom/en/devnet/pdf/amf0-file-format-specification.pdf
看懂这个文档需要先看懂一个规范https://tools.ietf.org/html/rfc2234
ABNF规范
如果了解正则表达式, 这里面的有些概念更容易理解
- 基本格式
;可以有N个element
rule_name = element element element
- 字符串
; 下面的4个CRLF定义是完全相同的
CRLF = %d13.10 ; 用点分隔
CRLF = %x0D.0A
CRLF = %d13 %d10
CRLF = %x0D %x0A
; 下面的3个abc的定义也是一样的
abc = "abc"
abc = "a" "b" "c"
a = "a"
b = "b"
c = "c"
abc = a b c
- 可选元素
;接受a, b, c, d这4个规则中的其中一个, 相当于"或"
rule = a / b / c / d
AMF0规范中, 使用|代替了/
rule = a | b | c | d
- 追加可选元素
rule = a
rule =/ b
rule =/ c /d
;结果等同于
rule = a / b / c / d
可选元素使用场景举例:
DIGIT = "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9"
;它表示了数字字符的集合, 等同于
DIGIT = %x30-39
- 顺序组 有点类似于正则表达式的[], 对于程序员来说, 这个很容易理解
rule = elem (foo / bar) blat
等同于
rule = (elem foo blat) / (elem bar blat)
- 重复
rule = 1*10 DIGIT ; 1到10个数字
rule = 2 DIGIT ; 2个数字
rule = * DIGIT ; 任意个数字(0到无穷大)
rule = *1 DIGIT ; 0到1个数字
rule = [DIGIT] ; []表示可选, 等同于 *1 DIGIT
AMF0基本格式
AMF0的元素的第1个字节为marker, 表示这段内容的编码格式. 不同的marker,内容的编码格式不同
-
数字Number 双精度浮点数
0x00 + 8字节的IEEE-754浮点数 IEEE754说明 -
Boolean
0x01 + 1字节(0,或1) -
String
使用UTF-8编码
0x02 + 2字节长度 + 字符串 -
Object
按照key-value的形式存储
0x03 + (String + Value) + (String + Value) + ... + EMPTY String + 0x09