谷歌图像格式的幻数

Ved*_*ic. 3 image node.js webp

我正在开发(Node.js)我自己的小程序来检查文件(图像)类型。到目前为止一切顺利,直到我尝试为 Google WebP格式添加验证。

作为 Magic Number 的指南,我使用了文件类型库。在他们的源代码中,他们列出了 WebP 的幻数(第 45 行):

0x57、0x45、0x42、0x50

在我的库中,我只使用前两个字节。所以我用0x570x45作为参考。

实施后,我需要一个合适的图像样本。所以我把这个挖出来了。那是官方的 Google 图书馆示例。但是我从那里下载的图像具有不同的签名。我正进入(状态:

0x52 和 0x49 我也尝试为 WebP 找到 Magic Number,但没有成功。我能找到的只是这个Wiki。但它不提供幻数。

现在我希望你明白我的困境。我应该使用哪些信息?来自文件类型库的那个,还是从谷歌下载的图像样本中获取信息?

总结这个问题,我应该使用:

0x52 和 0x49(图像签名,从谷歌下载)

或者

0x57 和 0x45(来自图像类型库的样本)

或者

完全不同的东西?

小智 6

根据 Google 的WebP 容器规范,有损和无损格式的 WebP 文件头均由 12 个字节组成:

  • 32 位 RIFF 标签,由四个 ASCII 字母“R”、“I”、“F”、“F”组成,即 0x52、0x49、0x46、0x46。
  • 文件大小减去 8,指定为 32 位无符号整数,以 little-endian 字节顺序排列。
  • 32 位 WEBP 标签,由四个 ASCII 字母“W”、“E”、“B”、“P”组成,即 0x57、0x45、0x42、0x50。

所以你的“图像签名,从谷歌下载”显然是 RIFF 标签的第一个字节对,而“来自图像类型库的样本”是 WEBP 标签的第一个字节对。存储在文件中或通过互联网传输的 WebP 图像总是包含 RIFF 标头,因此您应该检查字母“R”、“I”,即 0x52、0x49。

但是请注意,仅检查前两个字节是相当不准确的。安全签名检查将测试前四个字节是否为“RIFF”,跳过四个长度字节,然后检查“WEBP”。