可靠地验证文件是否有效 JPG
Reliably verify file is valid JPG
我制作了一个脚本,可以使用 JPEG 幻数从任何文件中提取 JPG(数据以 FFD8 开头,以 FFD9 结尾)。
但这还不够,因为很多带有 JPEG 幻数的数据段并不是真正的 JPEG,只是其他随机数据位,如果您尝试以 JPEG 格式打开它们,将会抛出错误。
可以执行哪些额外的字节检查来验证 JPEG 文件的有效性(标记将存在于每个 jpeg 中)。
答案取决于您想进行的检查级别。每个 JPEG 流都应该在开头有一个 SOI 标记,在结尾有一个 EOI 标记。理论上,在 JPEG 图像之外的 EOI 市场之后可能会有数据。
再往下一层,可以查看是否有SOFx标记。应该只有一个。
然后你可以确保有足够的SOS标记。在顺序 JPEG 中,每个组件都应该有一个。对于渐进式 JPEG,您需要做更多的检查。
然后您可以检查是否存在 SOS 标记所需的所有 DHT 和 DQT 标记。
最后可以查看扫描数据,需要解压图片
我发现的一个非常可靠的检查是找到 start-of-frame 字节标记(完整的 table here)。
ff c0
或 ff c2
。
从那里收集字节,直到 header 结束(定义开始)ff c4
、ff db
或 ff dd
。
现在你有一个框架 header。前两个字节告诉你 header 的长度。确认收集的字节数与前两个字节的值匹配。 header长度通常为16。
如果ff c0 || ff c2
和ff c4 || ff db || ff dd
之间的长度与前两个字节的值不匹配,或者没有找到这样的字节序列,那么它不是有效的JPEG。
我制作了一个脚本,可以使用 JPEG 幻数从任何文件中提取 JPG(数据以 FFD8 开头,以 FFD9 结尾)。
但这还不够,因为很多带有 JPEG 幻数的数据段并不是真正的 JPEG,只是其他随机数据位,如果您尝试以 JPEG 格式打开它们,将会抛出错误。
可以执行哪些额外的字节检查来验证 JPEG 文件的有效性(标记将存在于每个 jpeg 中)。
答案取决于您想进行的检查级别。每个 JPEG 流都应该在开头有一个 SOI 标记,在结尾有一个 EOI 标记。理论上,在 JPEG 图像之外的 EOI 市场之后可能会有数据。
再往下一层,可以查看是否有SOFx标记。应该只有一个。
然后你可以确保有足够的SOS标记。在顺序 JPEG 中,每个组件都应该有一个。对于渐进式 JPEG,您需要做更多的检查。
然后您可以检查是否存在 SOS 标记所需的所有 DHT 和 DQT 标记。
最后可以查看扫描数据,需要解压图片
我发现的一个非常可靠的检查是找到 start-of-frame 字节标记(完整的 table here)。
ff c0
或 ff c2
。
从那里收集字节,直到 header 结束(定义开始)ff c4
、ff db
或 ff dd
。
现在你有一个框架 header。前两个字节告诉你 header 的长度。确认收集的字节数与前两个字节的值匹配。 header长度通常为16。
如果ff c0 || ff c2
和ff c4 || ff db || ff dd
之间的长度与前两个字节的值不匹配,或者没有找到这样的字节序列,那么它不是有效的JPEG。