簡體   English   中英

匹配流文件簽名

[英]Matching streamed file signature

我正在嘗試確定通過流接收的文件類型(以便使用適當的文件擴展名來命名)。 我已經編寫了由bytesToHex()方法(字節來自緩沖區)提供的bytesToHex() determineFormat(String str)方法。 不幸的是,這沒有按預期進行。 即使正在獲取.mp3 ,defineFormat determineFormat()始終返回.aac擴展名。

 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()方法:

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);
}

我認為這是因為您將模式與整個文件進行了匹配。 將模式更改為

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();

問題似乎比看起來簡單。 我正在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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM