Сравните два байтовых массива? (Ява)

У меня есть байтовый массив с известной двоичной последовательностью. Мне нужно подтвердить, что двоичная последовательность - это то, что она должна быть. Я пробовал .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

В вашем примере у вас есть:

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

Ответ 2

Проверьте статические java.util.Arrays.equals() методы. Там, который делает именно то, что вы хотите.

Ответ 3

Java не перегружает операторы, поэтому вам обычно нужен метод для не-базовых типов. Попробуйте метод Arrays.equals().

Ответ 4

Вы можете использовать как Arrays.equals(), так и MessageDigest.isEqual(). Однако эти два метода имеют некоторые отличия.

MessageDigest.isEqual() - метод сравнения по времени, а Arrays.equals() не является постоянным по времени и может привести к некоторым проблемам безопасности, если вы используете его в приложении безопасности.

Подробности разницы можно прочитать на Arrays.equals() vs MessageDigest.isEqual()

Ответ 5

Конечно, принятый ответ 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;
}

Ответ 6

Поскольку я хотел сравнить два массива для юнит-теста и пришел к этому ответу, я подумал, что смогу поделиться.

Вы также можете сделать это с:

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

  Assert.assertArrayEquals(array, secondArray);
}

И вы можете проверить Сравнение массивов в утверждениях JUnit для получения дополнительной информации.