Java-将字节转换为字符串并与其他字节进行比较

Java-将字节转换为字符串并与其他字节进行比较,java,string,compare,byte,Java,String,Compare,Byte,我刚刚开始学习Java,在我的第一个挑战中,我尝试从MP3中读取ID3v1标签。我将MP3的最后128个字节读入一个字节数组,然后从那里将其拆分。为了检查是否找到了有效的ID3标记,我将数组中的前3个字节转换为字符串,并将其与标记进行比较。问题是由字节组成的字符串永远不会与标记字符串匹配,即使我在eclipse调试器中运行它时它看起来应该匹配 我已经在下面粘贴了我正在使用的代码,有人能指出我在这里做错了什么吗 byte tagBytes[] = {84, 65, 71}; //Normally

我刚刚开始学习Java,在我的第一个挑战中,我尝试从MP3中读取ID3v1标签。我将MP3的最后128个字节读入一个字节数组,然后从那里将其拆分。为了检查是否找到了有效的ID3标记,我将数组中的前3个字节转换为字符串,并将其与标记进行比较。问题是由字节组成的字符串永远不会与标记字符串匹配,即使我在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;
}
更改标记头!=注意!tagHeader.equalsTAG

目前,您正在比较内存地址,而不是实际值

我这样写是为了清楚。对于空安全代码,应始终首先使用文本

i、 e

更改标记头!=注意!tagHeader.equalsTAG

目前,您正在比较内存地址,而不是实际值

我这样写是为了清楚。对于空安全代码,应始终首先使用文本

i、 e


如果您确定字节都是ASCII码或知道编码,则可以将字节转换为字符串。那么你应该和平等者比较,而不是因为后者会检查它是否不是同一个实例。在你的情况下,它总是一个不同的例子

    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;
    }
或者,只需执行以下操作即可避免创建冗余字符串对象:

    byte tagBytes[] = {84, 65, 71};
    if (!('T' == tagBytes[0] && 'A' == tagBytes[1] && 'G' == tagBytes[2])){
        System.out.println("No ID3v1 tag found");
        return null;
    }

如果您确定字节都是ASCII码或知道编码,则可以将字节转换为字符串。那么你应该和平等者比较,而不是因为后者会检查它是否不是同一个实例。在你的情况下,它总是一个不同的例子

    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;
    }
或者,只需执行以下操作即可避免创建冗余字符串对象:

    byte tagBytes[] = {84, 65, 71};
    if (!('T' == tagBytes[0] && 'A' == tagBytes[1] && 'G' == tagBytes[2])){
        System.out.println("No ID3v1 tag found");
        return null;
    }

字符串不能通过==进行比较,因为这会检查内存中的文字引用是否相同。改为使用TAG.equalstagHeader或TAG.equalsIgnoreCasetagHeader进行不区分大小写的比较

您还可以简化字符串构建,如下所示:

StringBuilder sb = new StringBuilder();
for(int i = 0; i < 3; i++) {
    sb.append((char)tagBytes[i]);
}
tagHeader = sb.toString();
您可能还需要指定字符集,否则可能会错误地转换字节。根据数据的编码方式,您可能需要指定不同的字符集:

tagHeader = new String(tagBytes,0,3,Charset.forName("UTF-8"));

字符串不能通过==进行比较,因为这会检查内存中的文字引用是否相同。改为使用TAG.equalstagHeader或TAG.equalsIgnoreCasetagHeader进行不区分大小写的比较

您还可以简化字符串构建,如下所示:

StringBuilder sb = new StringBuilder();
for(int i = 0; i < 3; i++) {
    sb.append((char)tagBytes[i]);
}
tagHeader = sb.toString();
您可能还需要指定字符集,否则可能会错误地转换字节。根据数据的编码方式,您可能需要指定不同的字符集:

tagHeader = new String(tagBytes,0,3,Charset.forName("UTF-8"));

这会将字节转换为字符串,并正确:

byte tagBytes[] = {84, 65, 71}; 
String s = new String(tagBytes, Charset.forName("US-ASCII"));
您的解决方案也有效。问题在于你的比较。你想要:

if (!tagHeader.equals("TAG")) {
对于字符串,!=或==测试两个字符串是否是相同的实例,而不是相同的值。您需要使用equals方法按值比较它们

变体: 要仅选择字节数组的一部分,请执行以下操作:

String s = new String(tagBytes, 0, 3, Charset.forName("US-ASCII"));
如果整个字节数组已转换为字符串,并且您希望查看它是否以TAG开头:

if (!tagHeader.startsWith("TAG")) {

这会将字节转换为字符串,并正确:

byte tagBytes[] = {84, 65, 71}; 
String s = new String(tagBytes, Charset.forName("US-ASCII"));
您的解决方案也有效。问题在于你的比较。你想要:

if (!tagHeader.equals("TAG")) {
对于字符串,!=或==测试两个字符串是否是相同的实例,而不是相同的值。您需要使用equals方法按值比较它们

变体: 要仅选择字节数组的一部分,请执行以下操作:

String s = new String(tagBytes, 0, 3, Charset.forName("US-ASCII"));
如果整个字节数组已转换为字符串,并且您希望查看它是否以TAG开头:

if (!tagHeader.startsWith("TAG")) {

通过简单的方法,您可以执行以下操作:

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");
    }
 }

通过简单的方法,您可以执行以下操作:

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");
    }
 }

或者tagHeader=new StringtagBytes。打得好,谢谢你的建议。或者tagHeader=new StringtagBytes。打得好,谢谢你的建议。