首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >匹配流文件签名

匹配流文件签名
EN

Stack Overflow用户
提问于 2013-10-22 20:09:53
回答 2查看 814关注 0票数 0

我试图确定通过流接收的文件类型(以便用正确的文件扩展名来命名它)。我编写了determineFormat(String str)方法,它是bytesToHex()方法的提要(字节来自缓冲区)。不幸的是,这并不像预期的那样工作;determineFormat()总是返回.aac扩展,即使.mp3正在接收。

代码语言:javascript
复制
 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()方法:

代码语言:javascript
复制
public String bytesToHex(byte[] bytes) {
    char[] hexChars = new char[bytes.length * 2];
    int v;
    for ( int j = 0; j < bytes.length; j++ ) {
        v = bytes[j] & 0xFF;
        hexChars[j * 2] = hexArray[v >>> 4];
        hexChars[j * 2 + 1] = hexArray[v & 0x0F];
    }
    return new String(hexChars);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-23 08:32:11

这个问题比表面上看起来要简单。我在用MPEG-2 Audio Layer 3 with ID3v2测试我的应用程序。我决定阅读原始的"HexToString`“输出:

代码语言:javascript
复制
0DCB1C992B37173740244875C143D50ACDBA0422CD01D73D3C78F05ED7BBC2B33F9D78A7FFF342C0241C6B56B11EC1867984C20F42A4FAC5B9C0
42220314C006D94E124673CD4CC27FC2FCE12215410F12086BE5A3EDFC6DB2BEB0EAEC6EAAA4BF997FFB3337F914AB1A89C808EA6D338912D72E
99CE11E899999D3AE1092590FB2B71D736DC544B0AFD1035A3FFF340C00E178B62E5BE48C46F04B8EFC106AE3F17DDE08B5FD48672EBEABB216A
8438B6FB3B33BF91D3F3EBFCE14184320532ABA37FFD59BFF6ABAD1AA9AADEE73220679D2C7DDBAB766433A99D8CA752B383067465691750A24A
00F32A5078E29258F6D87A620AFFF342C00A158B22E5BE5944BAE8BA2C54739BE486B719A76DF5FD984D5257DBEAC43B238598EFAB3592DE8DD5

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

代码语言:javascript
复制
Pattern aacPattern = Pattern.compile("(FFF1|FFF9)");
Pattern mp3Pattern = Pattern.compile("(FFF3|FFFA|FFFB)");

一开始,我被有关我从这个网站获得的签名的信息误导:sigs.html

票数 0
EN

Stack Overflow用户

发布于 2013-10-22 21:04:45

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

代码语言:javascript
复制
Pattern aacPattern = Pattern.compile("^(FFF1|FFF9)");
Pattern mp3Pattern = Pattern.compile("^(494433|FFFB)");

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

代码语言:javascript
复制
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
    sb.append(String.format("%02X", b));
}
// sb.toString();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19527360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档