首页 > ios > 详解Binary Plist格式

详解Binary Plist格式

  Apple Plist格式 有2种: XML格式 和 二进制格式(bplist, Binary Plist). 搜了一下没有太官方的文档说明二进制格式的描述,只有在苹果开源代码文件的注释里头提到, 我仔细研究了一下,也参考了Node.js代码和Python代码中的解析过程,把具体格式做下说明,如果有不对的请立即指正以免误导大家.

文件结构

注: T,K,L,M,N在文件尾的解释中有说明

文件头 对象表 偏移表 文件尾
开头8字节 8~K字节 K+L*N字节 最后32字节

文件头 (文件开始的8字节)

字段 长度 说明
格式 6 定值:62 70 6C 69 73 74 表示: “bplist”
版本 2 定值:30 30 表示:”00″

所以固定为 62 70 6C 69 73 74 30 30

文件尾 (文件最后的32字节)

字段 长度 说明
6 备用
L 1 偏移表中的整形字节长度
M 1 对象表中表示整数的字节长度
N 8 偏移表的元素个数
T 8 根节点在偏移表中的位置
K 8 偏移表在文件中的偏移量
举例,这是文件的最后32个字节: 
00 00 00 00 00 00 02 01   
00 00 00 00 00 00 00 45   
00 00 00 00 00 00 00 00  
00 00 00 00 00 00 03 EE 

L = 0x02 =2  
M = 0x01 =1  
N = 0x00 00 00 00 00 00 00 45 = 69
T = 0x00 00 00 00 00 00 00 00 = 0
K = 0x00 00 00 00 00 00 03 EE = 1006

说明 偏移表是从文件第1006个字节开始的, 共有69个元素,每个元素占2个字节, 其中第0个元
素是根节点的偏移位置.

偏移表 (文件从K开始的L*N字节)

偏移表中有N个元素,每个元素是占L个字节的整数,每个元素表示其对应的对象在文件中的偏移位置
举例, 根据上面的文件尾 我们找出了偏移表:
00 08 00 47 00 54 00 5C 
00 66 00 71 00 8D 00 9F 
00 B5 00 C8 00 D7 00 F4 
01 0A 01 27 01 47 01 66 
01 7B 01 86 01 99 01 AE 
01 C2 01 D6 01 EA 01 F8 
02 0D 02 30 02 46 02 5A 
02 7A 02 8C 02 99 02 A8 
02 AE 02 B3 02 BF 02 C6 
02 C9 02 CF 02 D7 02 F5 
02 FE 03 03 03 05 03 0E 
03 12 03 14 03 1A 03 20 
03 45 03 49 03 5B 03 5C 
03 5F 03 68 03 74 03 77 
03 8D 03 92 03 95 03 96 
03 97 03 99 03 BA 03 C0 
03 C5 03 DB 03 E2 03 EA 
03 EC

2个字节(L)表示一个元素 共得到69个10进制整数元素:
  8,  71,  84,  92, 102, 113, 141, 159, 
181, 200, 215, 244, 266, 295, 327, 358, 
379, 390, 409, 430, 450, 470, 490, 504, 
525, 560, 582, 602, 634, 652, 665, 680, 
686, 691, 703, 710, 713, 719, 727, 757, 
766, 771, 773, 782, 786, 788, 794, 800, 
837, 841, 859, 860, 863, 872, 884, 887, 
909, 914, 917, 918, 919, 921, 954, 960, 
965, 987, 994,1002,1004

根节点的位置T=0 取第0个元素为8 则表示根节点是从文件第8个字节开始的

对象表 (文件中8到K的字节)

类型 HEX 说明
单字节 0X X=0:空值 X=8:布尔假 X=9:布尔真
整数 1X 后面跟的2^X个字节就是这个数字的值
浮点数 2X 后面跟的2^X个字节就是这个数字的值
日期 33 后面接着8个字节的浮点数时间戳
二进制 4X X表示这段数据的字节数,如果X=F,则取后面一个字节的记为Y,随后的L个字节解析为整数Z,即为这段数据的字节数
字符串 5X ASCII编码 X表示这段数据的字节数,如果X=F则后面作为整数对象继续解析所得数既为字节数
字符串 6X Unicode编码 X表示这段数据的字节数,如果X=F则后面作为整数对象继续解析所得数既为字节数 记得双字节!
UID 8X X+1表示这段数据的字节数 现在被当做字符串来处理
数组 AX X表示其元素个数,如果X=F则后面作为整数对象继续解析所得数既为个数 后面接着X个元素在偏移表的位置
集合 CX X表示其元素个数,如果X=F则后面作为整数对象继续解析所得数既为个数 后面接着X个元素在偏移表的位置 现在被当做数组来处理了,Xcode编辑界面也找不到集合这个选项
字典 DX X表示其元素个数,如果X=F则后面作为整数对象继续解析所得数既为个数 后面接着X个key在偏移表的位置,X个value在偏移表的位置

=================== 20170724更新的分割线 ===================

例子实战

参见《详解Binary Plist格式之实战解析

转载请注明: 转载自阿凡树的博客

本文链接地址: 详解Binary Plist格式

  1. baiyunping333 5月 1st, 2017 @ 17:40 | #1

    有一个字打错了,但是理解了好半天。

  2. baiyunping333 5月 1st, 2017 @ 17:40 | #2

    而X=0xF,所以要从后
    面去M(这里是1)位0x10,而0x10表示的是整数

    应该是:
    而X=0xF,所以要从后
    面取M(这里是1)位0x10,而0x10表示的是整数

    • 阿凡树 5月 2nd, 2017 @ 10:21 | #3

      谢谢指正~~~

  3. 这个名字有人用吗 5月 24th, 2017 @ 11:52 | #4

    如果您和http://travis.wang/133/这篇文章是一个作者,我能不能问您个问题。
    UID 8X X+1表示这段数据的字节数,这个标识只是指出了字节数,但是这些自己具体在什么位置呢。请指教,我的邮箱471656957@qq.com
    建议:如果您不是和篇文章的作者,转载别人的文章最好注明一下。

    • 阿凡树 5月 24th, 2017 @ 15:19 | #5

      首先谢谢指正~~
      1. UID这个类型目前已经被废弃了,目前也没有找到含UID类型的文件。
      2. 谢谢提出建议。当年刚刚毕业,年少无知,以后也注意到了这一点,但是都已经三年前的事情,我也忘记当时转谁的文章了,只能在以后写文章的时候注意一下啦。

  4. 这个名字有人用吗 5月 24th, 2017 @ 16:44 | #6

    @阿凡树
    谢谢回答

  5. 水库 7月 18th, 2017 @ 14:22 | #7

    在对象表中

    > 二进制 4X X表示这段数据的字节数
    这里应该还要考虑X=F的情况,另外关于X=F的情况感觉按照你的解释并不能得到正确的结果,结合已有的代码,我感觉以数据类型为例
    > 如果X=F,则后面取一个字节的后四位记为Y,随后的2^Y个字节解析为整数Z,即为这段数据的字节数
    后面的字符串、数组等类型同理

    • 阿凡树 7月 24th, 2017 @ 14:10 | #8

      谢谢指正,已修改

评论提交中, 请稍候...

留言

可以使用的标签: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
Trackbacks & Pingbacks ( 0 )
  1. 还没有 trackbacks