首页 > ios > 详解Binary Plist格式之实战解析

详解Binary Plist格式之实战解析

  Plist二进制格式的实际解析思路,就依据下面的plist为例来解析,下面的例子涵盖了所有的Key。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>String</key>
	<string>StringValue</string>
	<key>NumberInt</key>
	<integer>100</integer>
	<key>NumberFloat</key>
	<real>0.123</real>
	<key>Date</key>
	<date>2017-07-24T02:46:25Z</date>
	<key>Data</key>
	<data>SGVsbG8gd29ybGQhSGVsbG8gd29ybGQhSGVsbG8gd29ybGQhSGVsbG8gd29ybGQh</data>
	<key>Boolean</key>
	<false/>
	<key>Array</key>
	<array>
		<string>Item0</string>
		<string>Item1</string>
	</array>
	<key>Dict</key>
	<dict>
		<key>ItemKey0</key>
		<string>ItemValue0</string>
		<key>ItemKey1</key>
		<string>ItemValue1</string>
	</dict>
</dict>
</plist>

  丢进Xcode里面自动编译,或者通过执行

plutil -convert xml1 test.plist

来进行转换。
下面是转换之后的二进制:

00000000: 6270 6c69 7374 3030 d801 0203 0405 0607  bplist00........
00000010: 0809 0a0b 0e0f 1011 1656 5374 7269 6e67  .........VString
00000020: 5444 6174 6155 4172 7261 7957 426f 6f6c  TDataUArrayWBool
00000030: 6561 6e54 4461 7465 5b4e 756d 6265 7246  eanTDate[NumberF
00000040: 6c6f 6174 5444 6963 7459 4e75 6d62 6572  loatTDictYNumber
00000050: 496e 745b 5374 7269 6e67 5661 6c75 654f  Int[StringValueO
00000060: 1030 4865 6c6c 6f20 776f 726c 6421 4865  .0Hello world!He
00000070: 6c6c 6f20 776f 726c 6421 4865 6c6c 6f20  llo world!Hello 
00000080: 776f 726c 6421 4865 6c6c 6f20 776f 726c  world!Hello worl
00000090: 6421 a20c 0d55 4974 656d 3055 4974 656d  d!...UItem0UItem
000000a0: 3108 3341 bf25 9701 0000 0023 3fbf 7ced  1.3A.%.....#?.|.
000000b0: 9168 72b0 d212 1314 1558 4974 656d 4b65  .hr......XItemKe
000000c0: 7931 5849 7465 6d4b 6579 305a 4974 656d  y1XItemKey0ZItem
000000d0: 5661 6c75 6531 5a49 7465 6d56 616c 7565  Value1ZItemValue
000000e0: 3010 6408 1920 252b 3338 4449 535f 9295  0.d.. %+38DIS_..
000000f0: 9ba1 a2ab b4b9 c2cb d6e1 0000 0000 0000  ................
00000100: 0101 0000 0000 0000 0017 0000 0000 0000  ................
00000110: 0000 0000 0000 0000 00e3                 ...........

1.查看文件头为 6270 6c69 7374 3030。
2.查看文件结尾的4个字节,算出
L = 0x1 = 1
M = 0x1 = 1
N = 0x17 = 23
T = 0x0 = 0
K = 0xe3 = 227
3.找到偏移表,从227(0xe3)字节开始,找到下面序列,刚好有N(N=23)个,表明有23个对象,包括开头的root节点,一个字典里面的Key和Value分别为两个对象,一个数组的每个item为一个对象。
0x08,0x19,0x20,0x25,0x2b,0x33,0x38,0x44,0x49,0x53,0x5f,0x92,
0x95,0x9b,0xa1,0xa2,0xab,0xb4,0xb9,0xc2,0xcb,0xd6,0xe1
4.根据上面找到偏表的位置,依次再对象表中,找到每一个对象。

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

本文链接地址: 详解Binary Plist格式之实战解析

  1. 还没有评论
评论提交中, 请稍候...

留言

可以使用的标签: <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