我已经制作了一个脚本,可以使用JPEG幻数从任何文件中提取JPG(数据以FFD8开头,以FFD9结尾)。
但是这还不够,因为许多带有JPEG幻数的数据段不是实际的JPEG,只是其他随机数据,如果尝试将其打开为JPEG,则会引发错误。
可以执行哪些其他字节检查来验证JPEG文件的有效性(每个jpeg中都会存在标记)。
答案 0 :(得分:1)
答案取决于您要执行的检查级别。每个JPEG流的开头应有一个SOI标记,结尾应有一个EOI标记。从理论上讲,EOI市场之后的数据可能会超出JPEG图像。
下一层,您可以检查是否有SOFx标记。应该只有一个。
然后,您可以确保有足够的SOS标记。在连续的JPEG中,每个组件上都应该有一个。对于渐进式JPEG,您需要做很多检查。
然后,您可以检查SOS标记所需的所有DHT和DQT标记是否存在。
最后,您可以检查扫描数据,这需要解压缩图像。
答案 1 :(得分:0)
我发现一个非常可靠的检查是找到帧开始字节标记(完整表here)。
ff c0
或ff c2
。
从那里收集字节,直到标头结束(以定义的开头)ff c4
,ff db
或ff dd
。
现在您有了框架标题。前两个字节告诉您标题的长度。确认收集的字节数与前两个字节的值匹配。标头长度通常为16。
如果ff c0 || ff c2
和ff c4 || ff db || ff dd
之间的长度与前两个字节的值不匹配,或者没有找到这样的字节序列,则它不是有效的JPEG。