匹配流式文件签名

时间:2013-10-22 20:09:53

标签: java mp3 aac

我正在尝试确定通过流接收的文件类型(为了使用正确的文件扩展名来命名)。我写了determineFormat(String str)方法,它由bytesToHex()方法提供(字节来自缓冲区)。不幸的是,这不能按预期工作; <{1}}即使正在接收determineFormat(),也始终会返回.aac分机。

.mp3

我使用此方法提供 public String determineFormat(String str) { Pattern aacPattern = Pattern.compile("FFF1|FFF9"); Pattern mp3Pattern = Pattern.compile("494433|FFFB"); Matcher matcher = aacPattern.matcher(str); if(matcher.find()) { return "aac"; } matcher = mp3Pattern.matcher(str); if(matcher.find()) { return "mp3"; } return "unknown"; } 方法:

determineFormat()

2 个答案:

答案 0 :(得分:1)

我认为这是因为您将模式与整个文件相匹配。将模式更改为

Pattern aacPattern = Pattern.compile("^(FFF1|FFF9)");
Pattern mp3Pattern = Pattern.compile("^(494433|FFFB)");

当然,如果只传入前几个字节,那就足够了。为了获得十六进制的字节,你可以做一些简单的事情,比如

StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
    sb.append(String.format("%02X", b));
}
// sb.toString();

答案 1 :(得分:0)

问题显示比看起来更简单。我正在使用MPEG-2 Audio Layer 3 with ID3v2测试我的应用。我决定阅读原始的“HexToString`输出:

0DCB1C992B37173740244875C143D50ACDBA0422CD01D73D3C78F05ED7BBC2B33F9D78A7FFF342C0241C6B56B11EC1867984C20F42A4FAC5B9C0
42220314C006D94E124673CD4CC27FC2FCE12215410F12086BE5A3EDFC6DB2BEB0EAEC6EAAA4BF997FFB3337F914AB1A89C808EA6D338912D72E
99CE11E899999D3AE1092590FB2B71D736DC544B0AFD1035A3FFF340C00E178B62E5BE48C46F04B8EFC106AE3F17DDE08B5FD48672EBEABB216A
8438B6FB3B33BF91D3F3EBFCE14184320532ABA37FFD59BFF6ABAD1AA9AADEE73220679D2C7DDBAB766433A99D8CA752B383067465691750A24A
00F32A5078E29258F6D87A620AFFF342C00A158B22E5BE5944BAE8BA2C54739BE486B719A76DF5FD984D5257DBEAC43B238598EFAB3592DE8DD5

“真实”文件签名显示为FFF3。之后我找到了这个网站,它描述了mpeg第3层文件:http://www.nationalarchives.gov.uk/PRONOM/Format/proFormatSearch.aspx?status=detailReport&id=687&strPageToDisplay=signatures。最后,我能够使我的代码与固定模式很好地协同工作:

Pattern aacPattern = Pattern.compile("(FFF1|FFF9)");
Pattern mp3Pattern = Pattern.compile("(FFF3|FFFA|FFFB)");

一开始,我误导了有关我从此网站获得的签名的信息:http://www.garykessler.net/library/file_sigs.html