[java] 두 바이트 배열을 비교 하시겠습니까? (자바)
~ 알려진 이진 시퀀스가있는 바이트 배열이 있습니다. 이진 시퀀스가 올바른지 확인해야합니다. .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'");
}
답변
귀하의 예에는 다음이 있습니다.
if (new BigInteger("1111000011110001", 2).toByteArray() == array)
객체를 다룰 때 ==
자바에서 참조 값을 비교 합니다 . 에서 반환 된 배열에 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!");
}
답변
정적 java.util.Arrays.equals()
메서드 제품군을 확인하십시오 . 당신이 원하는 것을 정확히하는 것이 있습니다.
답변
Java는 연산자를 오버로드하지 않으므로 일반적으로 비 기본 유형에 대한 메소드가 필요합니다. Arrays.equals () 메서드를 사용해보십시오 .
답변
둘 다 사용할 수 있습니다 Arrays.equals()
와 MessageDigest.isEqual()
. 이 두 가지 방법에는 약간의 차이가 있습니다.
MessageDigest.isEqual()
시간 상수 비교 방법이며 Arrays.equals()
시간 상수가 아니며 보안 응용 프로그램에서 사용하면 보안 문제가 발생할 수 있습니다.
차이점에 대한 자세한 내용은 Arrays.equals () 대 MessageDigest.isEqual () 에서 읽을 수 있습니다.
답변
물론, 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;
}
답변
단위 테스트를 위해 두 배열을 비교하고 싶었고이 답변에 도달했기 때문에 공유 할 수 있다고 생각했습니다.
다음과 같이 할 수도 있습니다.
@Test
public void testTwoArrays() {
byte[] array = new BigInteger("1111000011110001", 2).toByteArray();
byte[] secondArray = new BigInteger("1111000011110001", 2).toByteArray();
Assert.assertArrayEquals(array, secondArray);
}
더 많은 정보 는 JUnit 어설 션의 배열 비교에서 확인할 수 있습니다 .