关于在MIME类型magic规则中使用offset参数的疑问
嗨,我来帮你搞清楚这个offset参数的用法,结合你的.gp文件案例一步步说~
首先明确:offset参数代表的是从文件起始位置开始计算的字节偏移量,计数从0开始。比如offset=0就是文件的第一个字节,offset=10就是第11个字节(因为0是第一个计数位)。
看你给出的.hexdump输出,你要匹配的"Content/PK"字符串,我们来定位它的起始偏移量:
00000010 00 00 00 00 00 00 00 00 00 00 08 00 00 00 43 6f |..............Co|
00000020 6e 74 65 6e 74 2f 50 4b 03 04 14 00 08 00 08 00 |ntent/PK........|
从地址来看,00000010对应文件的第16个字节(十六进制0x10=十进制16),这一行的最后两个字节是43(对应字符C)和6f(对应字符o),它们的偏移量分别是16+14=30(十进制)和16+15=31。接下来的ntent/PK从偏移量32开始,所以整个"Content/PK"的起始偏移量是30。
另外要注意:你的.gp文件开头是PK,这是ZIP压缩文件的标志性签名,系统大概率已经有ZIP类型的magic规则。为了让你的.gp规则优先匹配,需要把priority设得比ZIP规则的优先级更高(数值越小优先级越高,比如默认ZIP可能用50,你可以设为30)。
最后给你整理好的magic规则:
<mime-type type="audio/x-gp"> <magic priority="30"> <match value="Content/PK" type="string" offset="30" /> </magic> <glob pattern="*.gp"/> </mime-type>
如果你怕偏移量算错,可以用这个命令直接定位字符串的字节偏移量:
grep -ob "Content/PK" /home/cactus/Descargas/arpeggio.gp
它会输出类似30:Content/PK的结果,直接用这个数字作为offset参数就好~
备注:内容来源于stack exchange,提问作者Magenta

