当前位置:  开发笔记 > 编程语言 > 正文

Python,有人可以通过base64编码来猜测文件的类型吗?

如何解决《Python,有人可以通过base64编码来猜测文件的类型吗?》经验,为你挑选了1个好方法。

假设我有以下内容:

image_data = """iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="""

这只是一个点图像(来自https://en.wikipedia.org/wiki/Data_URI_scheme).但我不知道它是图像还是文本等.是否有可能理解它只有这个编码的字符串?我在Python中尝试它,但它也是一般性问题.因此,对两者的任何见解都非常受欢迎.



1> Martijn Piet..:

你不能,至少没有解码,因为有助于识别文件类型的字节分布在base64字符上,而这些字符并不直接与整个字节对齐.每个字符编码6 ,这意味着每4个字符编码3个字节.

识别文件类型需要访问不同块大小的那些字节.例如,JPEG图像可以从字节FF D8或FF D9中识别,但这是两个字节; 后面的第三个字节也必须编码为4个字符块的一部分.

可以做的是解码足够的base64字符串来进行文件类型指纹识别.因此,您可以解码前4个字符以获得3个字节,然后使用前两个字符来查看对象是否为JPEG图像.可以从第一个或最后一个字节序列中识别出大量文件格式(PNG图像可以由前8个字节识别,GIF由前6个字符识别,等等).从base64字符串中解码那些字节是微不足道的.

你的样本是PNG图像; 您可以使用该imghdr模块测试图像类型:

>>> import imghdr
>>> image_data = """iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="""
>>> sample = image_data[:44].decode('base64')  # 33 bytes / 3 times 4 is 44 base64 chars
>>> for tf in imghdr.tests:
...     res = tf(sample, None)
...     if res:
...         break
...
>>> print res
png

我只使用了base64数据中的前33个字节来回显imghdr.what()函数将从你传递的文件中读取的内容(它读取32个字节,但该数字不会除以3).

有一个等效的soundhdr模块,还有一个python-magic项目,它允许您传递多个字节来确定文件类型.

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有