2
バイト文字列オブジェクトがpickledオブジェクトであるかどうかを識別する方法。バイト文字列がピクルされたオブジェクトであるかどうかを識別する方法?
たとえば、次の辞書では、b
がピクルされたオブジェクトであり、他のオブジェクトはそうでないことをどのように識別できますか?
example = {'a':1, 'b':b'\x80\x03K\x02.', 'c':b'3'}
バイト文字列オブジェクトがpickledオブジェクトであるかどうかを識別する方法。バイト文字列がピクルされたオブジェクトであるかどうかを識別する方法?
たとえば、次の辞書では、b
がピクルされたオブジェクトであり、他のオブジェクトはそうでないことをどのように識別できますか?
example = {'a':1, 'b':b'\x80\x03K\x02.', 'c':b'3'}
例えば最初のバイトは、プロトコル番号が続き、常に\x80
であることがそうストリームは漬物ストリームであること(あるかどうかを指示する方法はありますが、ここでは\x03
、最後のバイトでもあります常にb'.'
)、確かにそれを知るのは難しいです(最初のバイトはランダムな文字列の\x80
です)。だから、より良いだけでそれをunpickle化し、それがうまくいくかどうかを確認してみてください:
import pickle
def is_pickle_stream(stream):
try:
pickle.loads(stream)
return True
except UnpicklingError:
return False
上記の方法は、ストリームは、漬物ストリーム、False
であればそうでない場合True
を返し、loads
をスローした場合に例外がスローされます例外(メモリ不足など)。
これをアンピクルしようとすると、失敗した場合はアンピクルされたデータとして表示されます。 Pickleにはヘッダーがありますが、バイナリ文字列には同じヘッダーがあることは偶然かもしれません。 –
[* "許可よりも許してほしいのは簡単です" *(https://docs.python.org/3/glossary.html#term-eafp) – jonrsharpe