2017-01-29 2 views
2

Как определить, является ли объект строки байта маринованным объектом.Как определить, является ли байтовая строка маринованным объектом?

Например, в нижнем словаре, как я могу определить, что b - это маринованный объект, а другие объекты нет?

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

Вы можете попытаться ее разложить, и если это не удается увидеть, это нераспределенные данные. Pickle имеет заголовок, но совпадение может заключаться в том, что двоичная строка имеет один и тот же заголовок. –

+3

[* «Просить прощения легче, чем разрешение». *) (Https://docs.python.org/3/glossary.html#term-eafp) – jonrsharpe

ответ

3

Хотя есть способы, чтобы сказать, является ли это вероятно, что поток представляет собой поток рассола (например, первый байт всегда \x80, а затем номер протокола, здесь \x03, последние байты также всегда b'.'), в общем, это трудно понять, что точно (совпадение первого байт \x80 в случайной строке). Так что лучше просто попытаться unpickle его и посмотреть, если это работает:

import pickle 

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

выше метод будет возвращать True, если поток представляет собой поток рассола, False если это не так, и бросать исключение, если loads бросает исключение (из памяти и т. д.).

Смежные вопросы