此 PDF 的幻数之前的字节顺序标记是什么?
What is the Byte Order Mark preceding the magic number of this PDF?
我正在处理文件并使用幻数来识别文件类型有效性。
我正在使用 Java 的 Medsea mime-util JAR 来调查幻数并确定 mime。这个库说明了它从左到右检查的两个不同的 PDF 序列:
- 标准 PDF:
%PDF-
- 以 UTF-8 字节顺序标记 (BOM) 开头的 PDF:
\xef\xbb\xbf%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 毫无怨言地打开。发生这种情况是因为 Adobe 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 还是其他任何内容。
我正在处理文件并使用幻数来识别文件类型有效性。
我正在使用 Java 的 Medsea mime-util JAR 来调查幻数并确定 mime。这个库说明了它从左到右检查的两个不同的 PDF 序列:
- 标准 PDF:
%PDF-
- 以 UTF-8 字节顺序标记 (BOM) 开头的 PDF:
\xef\xbb\xbf%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 毫无怨言地打开。发生这种情况是因为 Adobe 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 还是其他任何内容。