我刚开始学习Java,而且我第一次尝试从MP3读取ID3v1标签。我将MP3的最后128个字节读入一个字节数组并从那里拆分。为了检查我找到了一个有效的ID3标签,我将数组中的前3个字节转换为字符串,并将其与“TAG”进行比较。问题是由字节组成的字符串永远不会匹配“TAG”字符串,即使它在我在eclipse调试器中运行时看起来应该是这样。
我已经粘贴了我正在使用的代码,有人可以指出我在这里做错了吗?
byte tagBytes[] = {84, 65, 71}; //Normally filed from a file, just here as an example.
String tagHeader = null; //String to hold tag header
tagHeader = Character.toString((char)tagBytes[0]) +
Character.toString((char)tagBytes[1]) +
Character.toString((char)tagBytes[2]);
if (tagHeader != "TAG"){
System.out.println("No ID3v1 tag found");
return null;
}
答案 0 :(得分:2)
==
无法比较字符串,因为这会检查内存中的文字引用是否相同。而是"TAG".equals(tagHeader)
或"TAG".equalsIgnoreCase(tagHeader)
进行不区分大小写的比较。
您还可以简化字符串构建,如下所示:
StringBuilder sb = new StringBuilder();
for(int i = 0; i < 3; i++) {
sb.append((char)tagBytes[i]);
}
tagHeader = sb.toString();
甚至,正如@Vulcan建议的那样,简单地说:
tagHeader = new String(tagBytes,0,3);
您可能也想要指定字符集,否则字节可能会被错误地转换。根据数据的编码方式,您可能需要指定不同的字符集:
tagHeader = new String(tagBytes,0,3,Charset.forName("UTF-8"));
答案 1 :(得分:1)
如果您确定它们都是ASCII(或者您知道编码),则可以将字节转换为String
。然后你应该与equals
而不是!=
进行比较,因为后来检查它是不是同一个实例。在你的情况下,它总是一个不同的实例。
byte tagBytes[] = {84, 65, 71};
String tagHeader = new String(tagBytes, Charset.forName("US-ASCII"));
if (!"TAG".equals(tagHeader)){
System.out.println("No ID3v1 tag found");
return null;
}
或者你可以通过这样做完全避免创建冗余的String
个对象:
byte tagBytes[] = {84, 65, 71};
if (!('T' == tagBytes[0] && 'A' == tagBytes[1] && 'G' == tagBytes[2])){
System.out.println("No ID3v1 tag found");
return null;
}
答案 2 :(得分:1)
这会将字节转换成字符串并正确:
byte tagBytes[] = {84, 65, 71};
String s = new String(tagBytes, Charset.forName("US-ASCII"));
您的解决方案也有效。这是你的比较问题。你想要:
if (!tagHeader.equals("TAG")) {
对于String,!=
或==
测试两个String是同一个实例,而不是相同的值。您需要使用equals()
方法按值进行比较。
的变体: 要只选择字节数组的一部分:
String s = new String(tagBytes, 0, 3, Charset.forName("US-ASCII"));
如果整个字节数组已转换为字符串,并且您想查看它是否以“TAG”开头:
if (!tagHeader.startsWith("TAG")) {
答案 3 :(得分:1)
以简单的方式,您可以执行以下操作:
public static void main(String[] args) {
byte tagBytes[] = {84, 65, 71}; //Normally filed from a file, just here fro example.
String tagHeader = null; //String to hold tag header
tagHeader = new String(tagBytes);
if (!tagHeader.equals("TAG")){
System.out.println("No ID3v1 tag found");
}
}
答案 4 :(得分:0)
将tagHeader != "TAG"
更改为!tagHeader.equals("TAG")
目前,您正在比较内存地址而不是实际值。
为了清楚起见,我这样写了。对于null安全代码,您应该始终首先使用文字。
即
"TAG".equals(tagHeader)