java - 匹配流文件签名

标签 java mp3 aac

我正在尝试确定通过流接收的文件类型(以便使用正确的文件扩展名命名它)。我编写了 defineFormat(String str) 方法,该方法由 bytesToHex() 方法提供(字节来自缓冲区)。不幸的是,这并没有按预期工作;即使正在接收 .mp3defineFormat() 也始终返回 .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";
}

我使用以下方法提供我的 defineFormat() 方法:

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

关于java - 匹配流文件签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19527360/

相关文章:

android - 在 Android 上播放 AAC 缓冲区

java - 如何打开用jdk 12编写的.jar

java - 百分比计算器在 Android Studio 中无法运行

python - 这是在 Python 中列出目录(包括最终子目录)中所有 .mp3 文件的有效方法吗?

google-chrome - Chromium 无法播放 mp3?

java - 如何检查提交时 LOC 是否增加?

java - 在 try block 中返回 vs 在 block 后返回

c# - 通过 Xamarin IDE 从 SD 卡读取 .mp3 文件

audio - ffmpeg - 在 LFE channel 上输出无低通的 5.1 AAC