如何正确解压Mac OS X 10.8.2导出vCard中的LZF压缩笔记?
解决苹果旧版vCard笔记字段解压问题
问题根源
你遇到的解压错误来自两个核心问题:
- vCard中多行分割的Base64字符串未正确合并,存在换行、空格干扰
- 苹果旧版的LZF压缩数据带有4字节头部(存储解压后的数据长度),标准
python-lzf模块无法直接识别该头部
解决步骤
1. 正确提取合并Base64字符串
vCard会自动将长字段换行拆分,你需要把X-APPLE-OL-NOTE字段中冒号后的所有行内容,去掉换行和空格后合并成完整的Base64字符串。比如示例中的字段:
X-APPLE-OL-NOTE;TYPE=text/rtf;X-COMPRESSION=X-OL;X-HASH=03c582c83054be62e05 e09df57aff23b;X-HASHALGORITHM=X-zMD5;ENCODING=B:fAAAAI0AAABMWkZ1YU/S1F8AAwF AAHIB9wK3VgSQZC0AcGECgAqScASQdzEYMTA0AUAPc2g5OIYwAUAAwHJnbDEMAd0Q4nIRMgsDDN A1DAEM0F0P4DYC0QoRAUBpAUB1VGxuAiBlAgBjAUBjAQu1IChBYnJhaGBhbXNlKQ9AFcA=
需合并为:fAAAAI0AAABMWkZ1YU/S1F8AAwFAAHIB9wK3VgSQZC0AcGECgAqScASQdzEYMTA0AUAPc2g5OIYwAUAAwHJnbDEMAd0Q4nIRMgsDDNA1DAEM0F0P4DYC0QoRAUBpAUB1VGxuAiBlAgBjAUBjAQu1IChBYnJhaGBhbXNlKQ9AFcA=
2. 修正解压代码
跳过LZF数据的前4字节头部,再使用python-lzf解压:
import base64 import lzf # 合并后的完整Base64字符串 base64_string = "fAAAAI0AAABMWkZ1YU/S1F8AAwFAAHIB9wK3VgSQZC0AcGECgAqScASQdzEYMTA0AUAPc2g5OIYwAUAAwHJnbDEMAd0Q4nIRMgsDDNA1DAEM0F0P4DYC0QoRAUBpAUB1VGxuAiBlAgBjAUBjAQu1IChBYnJhaGBhbXNlKQ9AFcA=" # Base64解码 decoded_data = base64.b64decode(base64_string) # 跳过前4字节的苹果专属LZF头部,解压剩余数据 # 前4字节为小端序的解压后长度,可通过int.from_bytes(decoded_data[:4], byteorder='little')验证 decompressed_data = lzf.decompress(decoded_data[4:], 1000) # 转换为可读的RTF文本(原始存储格式为RTF) rtf_text = decompressed_data.decode('utf-8') print(rtf_text)
3. 验证结果
运行代码后会得到原始RTF格式的笔记内容,示例输出大致为:
{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360 {\fonttbl\f0\fswiss\fcharset0 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural \f0\fs24 \cf0 abra(ham) sample)}
批量处理提示
如果需要处理大量vCard文件,可以编写脚本自动遍历每个条目,提取并处理X-APPLE-OL-NOTE字段,将解压后的内容写入标准NOTE字段,这样Sonoma系统的通讯录就能正常识别笔记内容。
内容的提问来源于stack exchange,提问作者fractional_ideal
相关产品推荐
相关产品推荐

