[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 어설 션의 배열 비교에서 확인할 수 있습니다 .


답변