【问题标题】:Plist: Why is notepad presenting data as base64 and python showing ascii / unicode?Plist:为什么记事本将数据显示为base64而python显示ascii / unicode?
【发布时间】:2021-09-08 01:01:07
【问题描述】:

我正在处理许多 .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。

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

【问题讨论】:

    标签: python encoding base64 plist decoding


    【解决方案1】:

    为什么记事本和类似程序将值字段显示为base64,在python中打开时(我尝试在Python中打开“rb”和“r”,都给出相同的结果)不编码/解码为base64?

    基于 XML 的 plist 将 NSData/CFData 编码为 &lt;data&gt; 元素,并将 base64 编码的数据作为元素内容。

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

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

    【讨论】:

    • 谢谢。你能澄清一下第一句话的意思吗?或者指出我应该进一步研究的主题以更好地理解这一点?
    • 关于 plists 的维基百科文章可能是一个好的开始,然后您可以查看它使用的参考资料。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 2014-05-26
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多