我了解到在 python3 中有 5 种不同的 pickle 文件协议(Link)。 我想知道如何从泡菜文件中获取元数据信息(特别是协议)。
基于 Python 3.8 中的 pickle 源代码和一些实验,通过查看前 2 个字节很容易获得版本号 2 及更高版本。第一个记录为:
PROTO = b'\x80' # identify pickle protocol
在上面的文件中,可以通过以下方式进行测试:
' '.join(f'{c:02x}' for c in pickle.dumps(42, protocol=2))
这给了我:
80 02 4b 2a 2e即一个字节 (0x80) 表示我们即将获得一个版本号,然后是版本号 2。如果我们使用更新的版本号运行它,它会适当地更改,即版本 5 给出:
80 05 4b 2a 2e这看起来很简单。较低的版本号似乎没有报告任何内容,但也许其他人会提出一些建议!
import pickletools
pickle_file = 'C:\Users\stephen\Documents\somefile.pickle'
with open(pickle_file, 'rb') as f:
opcodeinfo_generator = pickletools.genops(f)
print(f'pickle protocol: {next(opcodeinfo_generator)[1]}')