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



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

5 ответов:

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

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

при работе с объектами, == в java сравнивает референсные значения. Вы проверяете, чтобы увидеть, если ссылка на массив, возвращенный toByteArray() это то же самое, что и ссылка, содержащаяся в array, которая, конечно, никогда не может быть правдой. Кроме того, классы массива не переопределяют .equals() так что поведение-это Object.equals(), который также сравнивает только контрольных значений.

для сравнения содержание из двух массивов статические методы сравнения массивов предоставляются массивы класс

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() семейство методов. Есть один, который делает именно то, что вы хотите.

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

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

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

детали для разницы можно прочитать на массивы.equals () vs MessageDigest.isEqual ()

конечно, принятый ответ массивов.равно (байт [] первый, байт [] второй) правильно. Мне нравится работать на более низком уровне, но я не смог найти эффективную функцию низкого уровня для выполнения тестовых диапазонов равенства. Я должен был взбить свой собственный, если кому-то это нужно:

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

Comments

    Ничего не найдено.