1 Plist 存储格式 📅 2026/6/25 22:00:14 同时如果输出到控制台fmt还可以选择是按照OC还是Swift的方式进行输出:// 按照 OC 输出MacBook-Pro:~ user$ plutil -convert objc -o - xxxx.plist/// Generated from xxxx.plist__attribute__((visibility(hidden)))NSDictionary * const xxxx {BuildVersion : 50,CFBundleShortVersionString : 4.13,CFBundleVersion : 3146.1.2,ProjectName : Notes,SourceVersion : 3146001002000000,};// 按照 Swift 输出MacBook-Pro:~ user$ plutil -convert swift -o - xxxx.plist/// Generated from xxxx.plistlet xxxx [BuildVersion : 50,CFBundleShortVersionString : 4.13,CFBundleVersion : 3146.1.2,ProjectName : Notes,SourceVersion : 3146001002000000,]上面命令中的-o -表示要输出到控制台。2 Plist 二进制格式Plist二进制格式描述在苹果CF代码库中的CFBinaryPList.c中。Plist二进制格式整体如下:从图上可以看到Header和Trailer的大小是固定的。Objects和Offset-Table部分是可变的。下面给出了一个二进制Plist的内容相关部分已经用不同颜色进行了区分:将二进制Plist打印为xml输出到控制台的内容为:MacBook-Pro:~ user$ plutil -convert xml1 -o - xxxx.plist?xml version1.0 encodingUTF-8?!DOCTYPE plist PUBLIC -//Apple//DTD PLIST 1.0//EN http://www.apple.com/DTDs/PropertyList-1.0.dtdplist version1.0dictkeyBuildVersion/keystring50/stringkeyCFBundleShortVersionString/keystring4.13/stringkeyCFBundleVersion/keystring3146.1.2/stringkeyProjectName/keystringNotes/stringkeySourceVersion/keystring3146001002000000/string/dict/plist可以将xml内容和二进制内容对照着看。2.1 HeaderHeader总共有8字节定义如下:// ForFoundationOnly.htypedef struct {uint8_t _magic[6];uint8_t _version[2];} CFBinaryPlistHeader;2.1.1 magicmagic固定为plist。2.1.2 versionplist常见的version是00。同时还有15和16。版本15和16都没有文档说明。2.2 TrailerTrailer固定位于二进制Plist的尾部总共32字节。Trailer的定义如下:// ForFoundationOnly.htypedef struct {uint8_t _unused[5];uint8_t _sortVersion;uint8_t _offsetIntSize;uint8_t _objectRefSize;uint64_t _numObjects;uint64_t _topObject;uint64_t _offsetTableOffset;} CFBinaryPlistTrailer;2.2.1 UnusedTrailer开始的头5字节没有使用始终是0。2.2.2 SortVersionSortVersion表是Plist中的Key是否排序占用1字节。0表示未排序。2.2.3 OffsetIntSizeOffsetIntSize表示Offset-Table中每一项占用的字节数。在上面例子中可以看到OffsetIntSize为1表示Offset-Table中每项只占用1字节。2.2.4 ObjectRefSizeObjectRefSize表示Dict和Array中引用的对象索引占用的字节数。在上面例子中ObjectRefSize为1表示Dict和Array中引用对象的索引占用1字节。以Objects区域的第1个字节d5为例。