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