Plist:为什么记事本将数据显示为 base64 而 python 显示为 ascii / unicode?

Plist: Why is notepad presenting data as base64 and python showing ascii / unicode?

我正在处理许多 .plist 文件。通常我在记事本或类似程序中打开它们,显示以下第一行(文件很大,所以我将示例缩减为几行):

<?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>cert</key>
    <array>
        <dict>
            <key>KeyNameHere</key>
            <data>
            MQwwCgwEcHJvdAwCZGs=
            </data>
            <key>AnotherKeyNameHere</key>
            <data>
            NjU0QkNBOUYtQjM4Qi00NzY3LUEyRjYtRDkwQ0EyNzcyQTM3
            </data>
            <key>UUID</key>
            <data>
            NjY4NzUzRTItNTg3OC00MDNBLUE3NkYtQzZCQzQ3QjVEMzIz

dict 元素中的值字段包含以 base64 编码的字符串(我在这里使用的术语正确吗?)。所以我的想法是写一个脚本来解析和解码这些值。我首先编写此脚本以打开并打印 Python:

中的 plist 文件
import plistlib

with open("..test.plist", "rb") as file:
pl = plistlib.load(file)

for x in pl:
    for y in pl[x]:
        for z in y:
            print(z, y[z])

但是,当我 运行 这个脚本时,字典中的许多值字段都以解码/人类可读的格式显示。例如,UUID 字段不是显示为 base64 字符串,而是显示为 UUID。

为什么记事本和类似程序在 python 中打开时将值字段显示为 base64(我尝试在 Python 中打开时同时使用“rb”和“r”,两者都给出同样的结果)不编码/解码为 base64?非常感谢任何有关理解解码/编码差异的帮助和输入。

Why does notepad and similar programs show the value-fields as base64, when opening in python (I have tried open in Python with both "rb" and "r", both giving the same result) does not encode / decode to base64?

XML-based plists encode NSData/CFData as <data> elements with the base64-encoded data as element content.

由于您使用的是 plistlib,它会解码该内容并为您提供实际数据。这就是使用 plistlib 的要点:它将 plist 数据解码为本机类型和内容(并且在二进制和 xml plist 中应该以相同的方式工作)。

如果您出于某种原因想要访问原始 plist 数据,您可以改用 XML 库打开 plist 文件。