Plist 二进制格式
1 Plist 存储格式Plist文件有3种存储格式:xmlJSON二进制使用plutil -convert fmt命令可以在这3种格式之间相互转换。fmt分别对应上面3种存储格式:xml1jsonbinary1同时如果输出到控制台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为例。d5的高4bit代表数据类型d代表Dict。d5的低4bit在Dict场景代表key-value对的个数也就是这个Dict有5个key-value对。d5后面0x01-0x05每1个字节代表key在Offset-Table中的索引。0x06-0x0a每1个字节代表value在Offset-Table中的索引。如果ObjectRefSize为2那么这些索引就会占用2个字节。2.2.5 Num-ObjectsNum-Objects代表二进制Plist中的对象个数。在上面例子中有一个Dict这个Dict有5个key-value对因此总共有11个对象。2.2.6 Top-ObjectTop-Object表示根对象偏移量一般都为0。在上面例子中根对象就是plist节点。2.2.7 Offset-Table OffsetOffset-Table Offset表示Offset-Table的偏移量。在上面例子中Offset-Table位于0x93处。2.2.8 Offset-TableOffset-Table中的每一项存储对象在Plist文件中的偏移量。Offset-Table的项从0开始计数。上面例子中Offset-Table的第0项为0x08。Plist二进制偏移0x08处的值是d5。d5代表了数据类型。d5高4bit代表这是一个Dict。d5低4bit代表这个Dict有5个key-value对。2.2.9 ObjectsObjects区域就是二进制Plist的数据区。3 Plist 二进制中的数据类型常见的Plist二进制中的数据类型如下:0x000x00代表null。0x080x08代表布尔值false。0x090x09代表布尔值true。0x1n0x1n表示是int类型。0x1n中的n可以取0~7表示这个int占用2^n个字节这些字节是大端在前排列。比如0x11 0x20 0x30那么n1表示这个int占用2个字节为0x2030。0x2n0x2n表示是real类型。0x2n中的n可以取值0~7表示这个real类型占用2^n个字节这些字节是大端在前排列。0x5n0x5n表示ASCII字符串。0x5n的n取值0-f表示这个ASCII字符串占用的字节数。ASCII字符串的内容接在0x5n的后面。但是如果nf那么后面的1个字节表示一个int类型定义了这个ASCII字符串占用的字节数。比如有一个字节序列0x5f 10 0f。0x5f表示这是一个ASCII字符串。10按照上面int的定义它后面的2^01个字节定义了这个整数也就是0xf。那么整个ASCII字符串就占用0xf个字节。anan表示是Array类型。an的n取值0-f表示这个Array中元素的个数。Array中每个元素在Offset-Table中的索引直接接在an后面。如果nf那么就和0x5n中的一样。dndn表示是Dict类型。dn的n取值0-f表示这个Dict的key-value对个数。Dict后面先跟key在Offset-Table中的索引接着跟着value在Offset-Table中的索引。如果nf那么就和0x5n中的一样

相关新闻

Windows 11/10 系统重置功能深度评测:3种场景对比与5个关键数据备份点

Windows 11/10 系统重置功能深度评测:3种场景对比与5个关键数据备份点

Windows系统重置功能完全指南:3种模式详解与数据备份策略当Windows系统运行缓慢或出现故障时,许多用户的第一反应是重装系统。但实际上,Windows 10/11内置的"重置此电脑"功能提供了更便捷的解决方案。与传统的U盘重装方式相比&…

2026/7/7 23:51:16阅读更多 →
CSS 伪元素 ::before/::after 性能与 SEO 影响分析:3 个常见误区与优化方案

CSS 伪元素 ::before/::after 性能与 SEO 影响分析:3 个常见误区与优化方案

CSS 伪元素 ::before/::after 性能与 SEO 影响分析:3 个常见误区与优化方案在当今追求极致用户体验和搜索引擎友好性的前端开发中,CSS 伪元素 ::before 和 ::after 已成为不可或缺的工具。它们为开发者提供了在不增加 DOM 节点的情况下增强页面视觉效果的…

2026/7/7 23:46:16阅读更多 →
CSS ::before/::after 实战:5个场景解析 content 属性的 3 种高级用法

CSS ::before/::after 实战:5个场景解析 content 属性的 3 种高级用法

CSS ::before/::after 实战:5个场景解析 content 属性的 3 种高级用法当你在浏览网页时,是否注意过那些精致的图标提示、自动编号的列表或是图片加载失败时的优雅降级效果?这些看似简单的界面细节,背后往往隐藏着CSS伪元素的魔法。…

2026/7/7 23:46:16阅读更多 →
XSS 绕过实战:5种编码组合与3个现代WAF绕过案例解析

XSS 绕过实战:5种编码组合与3个现代WAF绕过案例解析

XSS 绕过实战:5种编码组合与3个现代WAF绕过案例解析在Web安全领域,XSS(跨站脚本攻击)始终是攻防双方博弈的焦点。随着WAF(Web应用防火墙)技术的不断进化,传统的XSS攻击手段已难以奏效。本文将深…

2026/7/8 0:56:21阅读更多 →
PyTorch 2.0+ 张量维度转换:view、reshape、permute 等8种方法性能对比与内存分析

PyTorch 2.0+ 张量维度转换:view、reshape、permute 等8种方法性能对比与内存分析

PyTorch 2.0 张量维度转换:8种核心方法性能对比与内存优化指南在深度学习模型开发中,张量维度转换是最基础却至关重要的操作。PyTorch提供了多达8种维度操作方法,但它们的性能特征和内存行为却大相径庭。本文将深入剖析view、reshape、permut…

2026/7/8 0:56:21阅读更多 →
YOLO目标检测实战:从数据采集到本地部署全流程指南

YOLO目标检测实战:从数据采集到本地部署全流程指南

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 第一次接触 YOLO 目标检测时,很多人会陷入一个误区:以为只要下载一个预训练模型,跑通 demo 就掌握…

2026/7/8 0:56:21阅读更多 →
多代理配置:如何让OpenClaw的不同Agent使用不同的代理出口?

多代理配置:如何让OpenClaw的不同Agent使用不同的代理出口?

在多代理场景下,每个 Agent 独立代理出口的核心价值在于 实现彻底的账号与身份隔离。当你需要同时运营多个社交媒体账号、管理不同客户群体的咨询,或让不同 Agent 负责不同业务线时,如果所有流量都从一个 IP 出口发出,平台的风控系…

2026/7/8 0:56:21阅读更多 →
高性能APK解析与零配置部署架构解析:实现Windows平台Android应用无缝运行

高性能APK解析与零配置部署架构解析:实现Windows平台Android应用无缝运行

高性能APK解析与零配置部署架构解析:实现Windows平台Android应用无缝运行 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 在移动应用开发与跨平台工作流日益…

2026/7/8 0:56:21阅读更多 →
建筑工程机电安装

建筑工程机电安装

建筑工程机电安装。建筑工程中的机电安装是一项至关重要的工作,它涵盖了电气、通风、空调、消防等多个系统,对建筑物的正常使用和功能发挥起着决定性作用。随着现代建筑的日益复杂和智能化,机电安装的技术要求也越来越高。一、机电安装的重要…

2026/7/8 0:51:20阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/7 4:43:43阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/7 2:56:31阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/7 1:03:28阅读更多 →
作为一个给团队打绩效的人,我想说几句

作为一个给团队打绩效的人,我想说几句

我每半年都会给团队成员打绩效,也会参与和 CTO 的绩效校准,所以从管理者的视角,说说这件事 首先,我先把结论告诉你:接受结果,但一定要把原因问清楚。 因为当绩效公布到你这里的时候,结果基本已…

2026/7/8 0:01:17阅读更多 →
A股股指期货:全维度解析(多表格结构化完整版)

A股股指期货:全维度解析(多表格结构化完整版)

一、基础定义与核心本质股指期货全称股票价格指数期货,是中国金融期货交易所(中金所)上市的标准化金融期货合约,交易标的为 A 股大盘指数,约定未来特定时间按约定价格现金交割指数涨跌差价,不交割一篮子股票…

2026/7/8 0:01:17阅读更多 →
iOS越狱新手指南:从困惑到掌控,3天解锁iPhone无限潜能的真实故事

iOS越狱新手指南:从困惑到掌控,3天解锁iPhone无限潜能的真实故事

iOS越狱新手指南:从困惑到掌控,3天解锁iPhone无限潜能的真实故事 【免费下载链接】Jailbreak iOS 26.4 - 26, 17 - 17.7.5 & iOS 18 - 18.7.3 Jailbreak Tools, Cydia/Sileo/Zebra Tweaks & Jailbreak News Updates || AI Jailbreak Finder &…

2026/7/8 0:01:17阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/7 5:11:21阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/7 5:11:21阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/7 5:11:21阅读更多 →