此 PDF 的幻数之前的字节顺序标记是什么?

What is the Byte Order Mark preceding the magic number of this PDF?

我正在处理文件并使用幻数来识别文件类型有效性。

我正在使用 Java 的 Medsea mime-util JAR 来调查幻数并确定 mime。这个库说明了它从左到右检查的两个不同的 PDF 序列:

如果 PDF 不以这些序列中的任何一个开头,则会被拒绝。

我收到了以下文件(见图),该文件可以在 Acrobat 和其他查看器中有效打开;我不知道 %PDF-.

之前的值的 Byte Order Mark (BOM) 是什么

255044462D%PDF-

这是带有未识别 BOM 的 HEX 序列:

ACED0005757200025B42ACF317F8060854E0020000787000007CD4255044462D

这是有效的物料清单吗?如果有效,我该如何识别它?


更新

根据以下答案,解决方案是检查上述序列的前 1024 个字符。我已经在 Medsea mime-util 库中解决了这个问题,方法是使用内联源代码详细信息中未记录的功能更改 magic.mime 文件。

更改此条目:

0    string    %PDF-    application/pdf    ignore    pdf

如下:

0    string>1024    %PDF-    application/pdf    ignore    pdf

此未记录的功能在 eu.medsea.mimeutil.detector.MagicMimeEntry.java 方法 readBuffer(byte[]) for MagicMimeEntry.STRING_TYPE 的源代码中嵌入的注释中进行了解释:

// The following is not documented in the Magic(5) documentation.
// This is an extension to the magic rules and is provided by this utility.
// It allows for better matching of some text based files such as XML files

后续代码演示了从第 2 列“类型”值解析 ># 部分,并使用 # 作为要搜索的缓冲区大小,从第 1 列的值指示的起始索引开始。

阅读 相关主题:

According to the PDF standard (ISO 32000-2, similarly also already in ISO 32000-1):

The PDF file begins with the 5 characters “%PDF–”

(ISO 32000-2,第 7.5.2 节“文件头”)

特别是 “UTF-8 编码的 PDF(前面有 UTF-8 字节顺序标记)”,BOM 已经无效。

尽管如此,Adobe Reader 和其他 PDF 查看器将带有一些前导任意垃圾字节的文件作为 PDF 毫无怨言地打开。发生这种情况是因为 Adob​​e Reader 明确对规范

松懈

Acrobat viewers require only that the header appear somewhere within the first 1024 bytes of the file.

(Adobe PDF 参考第六版,附录 H.3“实施说明”,第 13 项)

其他 PDF 查看器效仿它。

因此,如果您想使用幻数来识别文件类型有效性,如“根据规范有效”,您必须只接受文件开始带有 5 个字符“%PDF-”。另一方面,如果你想通过“在普通观众中打开”来判断有效性,你必须接受任何 “%PDF-”出现在文件前 1024 字节内的任何内容 .

更糟的是,

Acrobat viewers also accept a header of the form

%!PS−Adobe−N.n PDF−M.m

(Adobe PDF 参考第六版,附录 H.3“实施说明”,第 14 项)

所以在这种情况下,您还必须在前 1024 个字节中接受此序列...


我没有将您的问题作为引用答案的副本来关闭,因为您似乎相信存在类似“UTF-8 编码的 PDF”之类的东西,某些 BOM 可能在“%PDF-”前面有效 – 不,在这些头字节前面不允许有任何内容,无论是 UTF BOM 还是其他任何内容。