如何以 plist 或 zip 格式读写二进制数据?

Posted

技术标签:

【中文标题】如何以 plist 或 zip 格式读写二进制数据?【英文标题】:How to read and write binary data as plist or zip? 【发布时间】:2019-11-01 17:15:16 【问题描述】:

f.pk 基本上是一个 base64 + zip 的容器,我需要在 Python 中导入并提取它。压缩文件是p.plist,所以f.pk = path + name + datap.plist

我找不到open()codecs.open() 的任何工作编码,无法将其作为str 打开并保存输出。我总是有一个生成的output.plist,它与原始的不同。

我已经使用的编码包括 ASCII; UTF-x;拉丁语_1; ISO-x;

import codecs, os

with open('f.pk', 'r', encoding='Latin_1') as f:
    f_open = f.read()

with codecs.open('f.pk', 'r', encoding='zip') as f:
    f_open = f.read()

f2=f_open[3:] #SKIP DUMMY PART
f3=f2.split('-DATA-')
f4=f3[1].split('-COMMENT-')

with open('output.plist', 'w') as f:
    print(f_out, file=f)

original.plist = 5e03964972def5b83880397b7377e6d1aea33e2boutput.plist = 6473aea0ae8bc75a04859effe1ee366de4cdd2d2

我已经深入分析了两个文件:,但没有成功。

【问题讨论】:

你试过对文件进行字节级别的操作吗? 是的,问题是我不希望字节作为输出,所以我必须找到相同的 zip、plist 和其他未知编码(我目前正在 zipfile.py 中查找此代码) . “属性列表是二进制格式,没有文本表示。要查看文本表示,请使用操作菜单中的更改格式子菜单选择不同的属性列表格式。”这正是我想要做的,读取和写入二进制格式为 str。如果我尝试编写 json 格式而不是 plist,我的应用程序将无法识别它。 如果你想读/写二进制,你必须在二进制模式下操作,即open(some_file, 'rb') as bin_file。它会给你一个 bytes 类型是的,但是你可以使用字节字符串来做你的拆分。 【参考方案1】:
with open('file.pk', 'rb') as f:
    f_open = f.read()

# do something with bytes here

with open('p.temp', 'wb') as f:
    pickle.dump(f_bytes, f) # temp file

# reload temp file
with open("p.temp", 'rb') as f:
    data = f.read()

# skip encodings and skip unwanted bytes
data = data[4:-3]

# save it
with open('p.plist', 'wb') as f:
    f.write(data)

os.remove('p.temp')

【讨论】:

以上是关于如何以 plist 或 zip 格式读写二进制数据?的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 是不是有任何框架以 plist 或 xml 形式提供大量任意二进制数据?

如何使用 SPM 托管在私有仓库中的 .zip 格式的二进制或 xcFramework

请问VB如何读写二进制文件

提取 zip 文件并将其存储到图像或文件字段

如何打开 plist 文件

plist文件格式转换器