如何识别一个字节字符串是否是一个 pickled 对象?

How to identify if a byte string is a pickled object?

如何识别字节字符串对象是否是 pickled 对象。

例如,在下面的字典中,如何识别 b 是 pickled 对象而其他对象不是?

example = {'a':1, 'b':b'\x80\x03K\x02.', 'c':b'3'}

虽然有一些方法可以判断流是否可能是泡菜流(例如第一个字节总是\x80,后面跟着协议数字,这里是 \x03,最后一个字节也总是 b'.'),一般来说很难确定(第一个字节是 \x80 可能是巧合)随机字符串)。所以你最好简单地尝试解开它,看看是否可行:

import pickle

def is_pickle_stream(stream):
    try:
        pickle.loads(stream)
        return True
    except UnpicklingError:
        return False

如果流是pickle流,上面的方法会returnTrue,如果不是pickle流False,如果loads抛出异常则抛出异常(内存不足等)。