【发布时间】:2020-10-22 08:11:47
【问题描述】:
我正在处理文件并使用幻数来识别文件类型的有效性。
我正在使用 Medsea mime-util JAR for Java 来调查幻数并确定 mime。这个库说明了它从左到右检查的两个不同的 PDF 序列:
- 标准 PDF:
%PDF- - 以 UTF-8 字节顺序标记 (BOM) 开头的 PDF:
\xef\xbb\xbf%PDF-
如果 PDF 不以其中任何一个序列开头,则会被拒绝。
我收到了以下文件(见图片),它可以在 Acrobat 和其他查看器中有效打开;我不知道 %PDF- 之前的值的 Byte Order Mark (BOM) 是什么。
255044462D 是%PDF-
这是带有未识别 BOM 的 HEX 序列:
ACED0005757200025B42ACF317F8060854E0020000787000007CD4255044462D
这是一个有效的 BOM,如果是,我如何识别它?
更新
根据下面的答案,解决方案是检查上述序列的前 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 列的值指示的起始索引开始。
【问题讨论】:
-
@Kayaman,我将前面的字符添加为 HEX。
-
见here,除了“标准PDF”之外的一切都是无效的。
标签: java pdf byte-order-mark magic-numbers