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


96

我有一个带有〜已知二进制序列的字节数组。我需要确认二进制序列是应该的。.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'");
}

您可以直接比较字符串吗?
对象

1
@objects-前导零。此外,String / BigInteger可能只是说明字节数组比较问题的一种方式。
Stephen C

您是否尝试过使用compareTo方法?BTW仅==比较原始值就可以了
ChriskOlson

以下是有关部分阵列相关的问题比较:stackoverflow.com/questions/16646967/...
Vadzim

Answers:


167

在您的示例中,您具有:

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

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

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

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




3

当然,可接受的Arrays.equal(字节[]第一,字节[]第二)的答案是正确的。我喜欢在较低级别上工作,但是我找不到低级有效函数来执行相等性测试范围。如果有人需要,我必须自己动手:

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

对于测试数组的子集而不是整个数组,这是一个很好的解决方案。但是,请注意,Arrays.equals(byte [],byte [])几乎可以完成您在此所做的所有操作(除了更有效地处理两个值是同一对象外,还可以优雅地处理传入的空数组)。当选择使用将由社区支持的标准库实现或编写我将永远支持的自定义实现时,我会每次都选择前者。
Tom Dibble 2015年

4
答案对于用例有两个数组并且要比较它们的字节范围而不用先复制数组的用例很有用。阵列副本会增加开销,增加垃圾并且不需要。我需要的是一个低级的c风格memcmp(),它很符合需求。当然,memcmp()仅接受1个length参数。此功能足够接近。
2015年

2

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

您也可以使用以下方法进行操作:

@Test
public void testTwoArrays() {
  byte[] array = new BigInteger("1111000011110001", 2).toByteArray();
  byte[] secondArray = new BigInteger("1111000011110001", 2).toByteArray();

  Assert.assertArrayEquals(array, secondArray);
}

您可以检查JUnit断言中的比较数组以获取更多信息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.