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