Java - 将字节转换为字符串并与另一个字符串进行比较

时间:2013-03-23 21:47:29

标签: java string compare byte

我刚开始学习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;
}

5 个答案:

答案 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)