Сравнить два байтовых массива?(Джава) - PullRequest
91 голосов
/ 26 марта 2011

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

160 голосов
/ 26 марта 2011

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

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

При работе с объектами == в java сравнивает ссылочные значения . Вы проверяете, совпадает ли ссылка на массив, возвращаемый 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!");
}
63 голосов
/ 26 марта 2011

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

11 голосов
/ 26 марта 2011

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

9 голосов
/ 22 мая 2015

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

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

Подробную информацию о разнице можно прочитать по адресу Arrays.equals () против MessageDigest.isEqual ()

3 голосов
/ 10 апреля 2015

Конечно, принятый ответ 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;
}
0 голосов
/ 30 апреля 2019

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

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

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

  Assert.assertArrayEquals(array, secondArray);
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...