gpt4 book ai didi

java - 匹配流文件签名

转载 作者:行者123 更新时间:2023-12-01 13:57:53 24 4
gpt4 key购买 nike

我正在尝试确定通过流接收的文件类型(以便使用正确的文件扩展名命名它)。我编写了 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com