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