比较两个字节数组? (JAVA)

时间:2011-03-26 02:44:12

标签: java binary

我有一个带有〜已知二进制序列的字节数组。我需要确认二进制序列是它应该是什么。除了.equals之外,我还尝试了==,但都没有奏效。

byte[] array = new BigInteger("1111000011110001", 2).toByteArray();
if (new BigInteger("1111000011110001", 2).toByteArray() == array){
    System.out.println("the same");
} else {
    System.out.println("different'");
}

6 个答案:

答案 0 :(得分:160)

在您的示例中,您有:

if (new BigInteger("1111000011110001", 2).toByteArray() == array)

在处理对象时,java中的==会比较参考值。您正在检查toByteArray()返回的数组引用是否与array中引用的引用相同,这当然永远不会成立。此外,数组类不会覆盖.equals(),因此行为是Object.equals()的行为,它也只比较参考值。

为了比较两个数组的内容Arrays class提供了静态数组比较方法

byte[] array = new BigInteger("1111000011110001", 2).toByteArray();
byte[] secondArray = new BigInteger("1111000011110001", 2).toByteArray();
if (Arrays.equals(array, secondArray))
{
    System.out.println("Yup, they're the same!");
}

答案 1 :(得分:63)

查看静态java.util.Arrays.equals()系列方法。有一个完全符合您的要求。

答案 2 :(得分:11)

Java不会重载运算符,因此通常需要一种非基本类型的方法。试试Arrays.equals()方法。

答案 3 :(得分:9)

您可以同时使用Arrays.equals()MessageDigest.isEqual()。这两种方法虽然存在一些差异。

MessageDigest.isEqual()是一种时间常数比较方法,Arrays.equals()是非时间常数,如果您在安全应用程序中使用它,可能会带来一些安全问题。

差异的详细信息可以在Arrays.equals() vs MessageDigest.isEqual()

处阅读

答案 4 :(得分:3)

当然,Arrays.equal(byte [] first,byte [] second)的接受答案是正确的。 我喜欢在较低级别工作,但我无法找到执行相等测试范围的低级别高效功能。如果有人需要,我不得不鞭打我自己:

public static boolean ArraysAreEquals(
 byte[] first,
 int firstOffset,
 int firstLength,
 byte[] second,
 int secondOffset,
 int secondLength
) {
    if( firstLength != secondLength ) {
        return false;
    }

    for( int index = 0; index < firstLength; ++index ) {
        if( first[firstOffset+index] != second[secondOffset+index]) {
            return false;
        }
    }

    return true;
}

答案 5 :(得分:0)

由于我想比较一个单元测试的两个数组,因此得出了我认为可以分享的答案。

您也可以使用以下方法做到这一点:

["d"]

您可以在Comparing arrays in JUnit assertions上查看更多信息。