Linux的Magic文件解析问题

时间:2020-11-26 06:01:31
如题,情景是这样的:
我需要根据文件的Magic Number来判断文件的MIMEType。因为用后缀名判断不是很好的方案。经过查找资料之后,发现Linux的magic文件能做到这一点,我把我虚拟机的magic文件弄了出来(centos 6.8)。然后也查阅的相关的资料。了解了magic文件的格式中每个段表示的什么意思。


然后有了如下问题:
我需要解析magic文件(Java语言)。我举个例子:
我截取了一段magic文件的内容,内容如下:

>8 string/W M4P \b, MPEG v4 system, iTunes AES encrypted
>8 string/W M4B \b, MPEG v4 system, iTunes bookmarked
>8 string/W qt \b, Apple QuickTime movie
!:mime video/quicktime                            -------------------------------   1

# MPEG sequences
# Scans for all common MPEG header start codes
0  belong     0x00000001     
>4  byte&0x1F     0x07    JVT NAL sequence, H.264 video
>>5      byte               66             \b, baseline
>>5      byte               77             \b, main
>>5      byte               88             \b, extended
>>7      byte               x              \b @ L %u
0        belong&0xFFFFFF00  0x00000100     
>3       byte               0xBA           MPEG sequence
!:mime  video/mpeg                                      ------------------------------2
>>4      byte               &0x40          \b, v2, program multiplex
>>4      byte               ^0x40          \b, v1, system multiplex
>3       byte               0xBB           MPEG sequence, v1/2, multiplex (missing pack header)
>3       byte&0x1F          0x07           MPEG sequence, H.264 video
>>4      byte               66             \b, baseline
>>4      byte               77             \b, main
>>4      byte               88             \b, extended
>>6      byte               x              \b @ L %u
>3       byte               0xB0           MPEG sequence, v4
!:mime  video/mpeg4-generic             ------------------------------------3
>>5      belong             0x000001B5
>>>9     byte               &0x80
>>>>10   byte&0xF0          16             \b, video
>>>>10   byte&0xF0          32             \b, still texture
>>>>10   byte&0xF0          48             \b, mesh
>>>>10   byte&0xF0          64             \b, face
>>>9     byte&0xF8          8              \b, video
>>>9     byte&0xF8          16             \b, still texture
>>>9     byte&0xF8          24             \b, mesh
>>>9     byte&0xF8          32             \b, face
>>4      byte               1              \b, simple @ L1
>>4      byte               2              \b, simple @ L2
>>4      byte               3              \b, simple @ L3

                       .....................................省略N行................................


>>7      byte&0x0F          6              \b, 50 fps
>>7      byte&0x0F          7              \b, 59.94 fps
>>7      byte&0x0F          8              \b, 60 fps
>>11     byte               &0x04          \b, Constrained

# MPEG ADTS Audio (*.mpx/mxa/aac)
# from dreesen@math.fu-berlin.de
# modified to fully support MPEG ADTS

# MP3, M1A
# modified by Joerg Jenderek
# GRR the original test are too common for many DOS files
# so don't accept as MP3 until we've tested the rate
0       beshort&0xFFFE  0xFFFA
# rates
>2      byte&0xF0       0x10           MPEG ADTS, layer III, v1,  32 kbps
!:mime audio/mpeg                              ------------------------- 4


1、在上边这段代码里,第8-15行是用来判断video/mpeg这个MIME Type的。对么?
2、video/mpeg4-generic这个MIMEType该怎么解释?!:mime video/mpeg4-generic这句话,上边和下边都有关于它的配置。我该怎么区分它的边界呢?
简而言之,在上边代码中,1和2的边界我能看明白,因为他们的格式都是一堆匹配条件,最后给个结果,但是3的边界怎么判断呢?因为在3中,有一部分匹配条件在3上方,有一部分在下方。我怎么把3的下方的条件个4的上方的条件划分开呢?我能看注释明白边界的位置,但是程序不认识注释啊。怎么把3和4的条件区分开?

3、关于第一个>符号,这个是相对位置,还是绝对位置啊?
例如:


2     xx    xx    xx
>4 xx    xx    xx
!:mimetype xx

这个要判断第二行条件的话。是从第4位开始取,还是从第6位开始取?

希望知道的前辈能予以解答一下,感激不尽。

1 个解决方案

#1


这么久都没人回答。。。哎。。。。

#1


这么久都没人回答。。。哎。。。。