如何以 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 + data
是p.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 = 5e03964972def5b83880397b7377e6d1aea33e2b
output.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 形式提供大量任意二进制数据?