假设我有以下内容:
image_data = """iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="""
这只是一个点图像(来自https://en.wikipedia.org/wiki/Data_URI_scheme).但我不知道它是图像还是文本等.是否有可能理解它只有这个编码的字符串?我在Python中尝试它,但它也是一般性问题.因此,对两者的任何见解都非常受欢迎.
你不能,至少没有解码,因为有助于识别文件类型的字节分布在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
项目,它允许您传递多个字节来确定文件类型.