C语言 写个小程序 可以读bplist文件

qq_15534581 2016-08-16 07:13:19
详解Binary Plist格式 03 AUGUST 2013 on bplist, plist
Apple Plist格式 有2种: XML格式 和 二进制格式(bplist, Binary Plist). 搜了一下没有太官方的文档说明二进制格式的描述,只有在苹果开源代码文件的注释里头提到, 我仔细研究了一下,也参考了Node.js代码和Python代码中的解析过程,把具体格式做下说明,如果有不对的请立即指正以免误导大家.
文件结构 注: T,K,L,M,N在文件尾的解释中有说明
文件头 对象表 偏移表 文件尾
开头8字节 8~K字节 K+L*N字节 最后32字节
1、文件头 (文件开始的8字节) 字段 长度 说明
格式 6 定值:62 70 6C 69 73 74 表示: "bplist"
版本 2 定值:30 30 表示:"00"
所以固定为 62 70 6C 69 73 74 30 30
2、文件尾 (文件最后的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个元素是根节点的偏移位置.
3、偏移表 (文件从K开始的L*N字节)
偏移表中有N个元素,每个元素是占L个字节的整数,每个元素表示其对应的对象在文件中的偏移位置
举例, 根据上面的文件尾 我们找出了偏移表:
0008 0047 0054 005C 0066 0071 008D 009F 00B5 00C8 00D7 00F4 010A 0127 0147 0166
017B 0186 0199 01AE 01C2 01D6 01EA 01F8 020D 0230 0246 025A 027A 028C 0299 02A8
02AE 02B3 02BF 02C6 02C9 02CF 02D7 02F5 02FE 0303 0305 030E 0312 0314 031A 0320
0345 0349 035B 035C 035F 0368 0374 0377 038D 0392 0395 0396 0397 0399 03BA 03C0
03C5 03DB 03E2 03EA 03EC
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个字节开始的

4、对象表 (文件中8到K的字节)
类型 HEX 说明
单字节 0X X=0:空值 X=8:布尔假 X=9:布尔真
整数 1X 后面跟的2^X个字节就是这个数字的值
浮点数 2X 后面跟的2^X个字节就是这个数字的值
日期 33 后面接着8个字节的浮点数时间戳
二进制 4X X表示这段数据的字节数
字符串 5X ASCII编码 X表示这段数据的字节数,如果X=F则后面作为整数对象继续解析所得数既为字节数
字符串 6X Unicode编码 X表示这段数据的字节数,如果X=F则后面作为整数对象继续解析所得数既为字节数 记得双字节!
UID 8X X+1表示这段数据的字节数
数组 AX X表示其元素个数,如果X=F则后面作为整数对象继续解析所得数既为个数 后面接着X个元素在偏移表的位置
集合 CX X表示其元素个数,如果X=F则后面作为整数对象继续解析所得数既为个数 后面接着X个元素在偏移表的位置
字典 DX X表示其元素个数,如果X=F则后面作为整数对象继续解析所得数既为个数 后面接着X个key在偏移表的位置,X个value在偏移表的位置
举例, 刚才找到了根节点的位置是8,开始递归的把对象全部找出来:
DF 10 1E 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E …

第一步: 第一个字节 是数据类型 0xDF, 为`DX`格式 说明是字典类型,而X=0xF,所以要从后面去M(这里是1)位0x10,而0x10表示的是整数,此整数的字节数2^0=1表示后面的1个字节0x1E就是这个字典的元素个数,既此字典有30个键值对.
第二步: 在`1E`后面跟的30个字节代码key在偏移表中的索引位置, 再后面30个字节是value的索引位置
第三步: 分别递归找出每个key/vaule对应的对象 组成了这个字典

-----------
再来一个:
D1 01 02
key[0]=01, 表示偏移表01指向它的值
val[0]=02, 表示偏移表02指向它的值

01给出了偏移量是11 我们从文件11个字节开始找到了此对象
5A 4D 69 6E 64 52 65 61 64 65 72 D5 03 04 05 06 ...

0x5A 说明这是个ASCII字符串. A表示长度为10个字节: 4D 69 6E 64 52 65 61 64 65 72 这在ASCII编码中代表的是:"MindReader" 所以我们得到了key是MindReader 剩下的value也用类似的方法可以得到了,哎0xD5 又是一个嵌套的字典...
...全文
1250 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
官方认定好文 2020-04-15
  • 打赏
  • 举报
回复
再来一个: D1 01 02 key[0]=01, 表示偏移表01指向它的值 val[0]=02, 表示偏移表02指向它的值 01给出了偏移量是11 我们从文件11个字节开始找到了此对象 请问,01给出了偏移量是11?01不是应该表示在偏移表的索引是1吗,按照上面的例子应该是71呀?!
那颗螺丝钉 2017-05-24
  • 打赏
  • 举报
回复
同求,没人弄的话我就自己写
qq_15534581 2016-08-16
  • 打赏
  • 举报
回复
我要源码 谢谢
内容概要:本文围绕城市场景下的无人机三维路径规划问题,提出了一种新颖的多目标粒子群优化算法(NMOPSO),旨在解决高维复杂环境中路径规划面临的多重挑战。研究聚焦于导航变量的多目标优化,构建了一个包含路径长度、飞行安全性、能量消耗等多个相互冲突目标的优化模型,并采用改进的粒子群算法进行高效搜索,最终获得一组Pareto最优解集,为实际决策提供多样化路径选择方案。该方法结合Matlab代码实现,详细阐述了算法的设计机制、数学建模流程及仿真验证过程,充分展示了其在密集城市建筑环境中有效规避障碍物、满足飞行动力学约束并实现多目标权衡的能力,具有较强的工程应用价值。; 适合人群:具备一定优化算法理论基础和Matlab编程能力,从事无人机路径规划、智能交通系统、自动化控制、人工智能应用等方向研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于城市环境中的无人机物流配送、巡检监控、应急救援等实际任务的三维路径规划;②为高维、非线性、多约束的多目标优化问题提供有效的算法设计思路与改进参考;③通过Matlab仿真平台复现算法,进一步开展性能测试、参数调优与算法对比研究,推动相关领域的技术创新。; 阅建议:此资源强调算法原理与工程实践的深度融合,建议者重点研目标函数的构建方式、约束条件的处理策略以及NMOPSO算法的核心改进机制,并务必动手运行和调试所提供的Matlab代码,以深入理解算法在三维空间路径优化中的具体实现细节与实际表现。
内容概要:本文档围绕基于10机39节点的电力系统仿真展开,依托Matlab/Simulink平台构建标准电力系统模型,系统性地实现了电力系统稳态与暂态过程的仿真分析。内容涵盖潮流计算、短路故障、暂态稳定性、N-k故障分析、蓄意攻击与级联故障模拟等核心问题,并引入混合整数线性规划(MILP)等优化方法进行电网脆弱性评估与关键故障筛选。文档突出科研复现导向,整合了状态估计、虚假数据注入攻击、优化算法等前沿技术的交叉应用,具有较强的理论深度与工程实践价值。; 适合人群:具备电力系统基本理论知识和Matlab/Simulink仿真能力的研究生、科研人员及电力工程技术人员,特别适用于从事电力系统稳定性分析、安全防护、故障演化机制与优化调度等领域研究的专业人士。; 使用场景及目标:① 掌握10机39节点系统的建模方法与仿真流程;② 学习并复现电力系统典型故障(如短路、N-k故障、级联故障)的建模与动态响应分析;③ 理解基于MILP的电网脆弱性评估、攻击策略建模与故障传播机制;④ 结合优化算法开展电力系统安全防御、恢复策略与韧性提升研究。; 阅建议:建议结合文档中标注的“顶级EI复现”“核心论文复现”等标签,重点关注模型构建逻辑与代码实现细节,优先运行仿真案例以理解其物理背景与数学建模原理,同时深入分析故障场景设定、目标函数设计及优化求解策略的工程意义与学术价值。

13,872

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧