두 바이트 배열을 비교 하시겠습니까? (자바)


96

~ 알려진 이진 시퀀스가있는 바이트 배열이 있습니다. 이진 시퀀스가 ​​올바른지 확인해야합니다. .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'");
}

문자열을 직접 비교할 수 있습니까?
객체

1
@objects-선행 0. 게다가, String / BigInteger는 바이트 배열 비교 질문을 설명하는 방법 일 수 있습니다.
Stephen C

compareTo 메서드를 사용해 보셨습니까? BTW ==는 원시 값을 비교합니다.
ChriskOlson

다음은 부분 배열 비교에 대한 관련 질문입니다. stackoverflow.com/questions/16646967/…
Vadzim

답변:


167

귀하의 예에는 다음이 있습니다.

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!");
}


11

Java는 연산자를 오버로드하지 않으므로 일반적으로 비 기본 유형에 대한 메소드가 필요합니다. Arrays.equals () 메서드를 사용해보십시오 .


11

둘 다 사용할 수 있습니다 Arrays.equals()MessageDigest.isEqual(). 이 두 가지 방법에는 약간의 차이가 있습니다.

MessageDigest.isEqual()시간 상수 비교 방법이며 Arrays.equals()시간 상수가 아니며 보안 응용 프로그램에서 사용하면 보안 문제가 발생할 수 있습니다.

차이점에 대한 자세한 내용은 Arrays.equals () 대 MessageDigest.isEqual () 에서 읽을 수 있습니다.


3

물론, 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;
}

이것은 전체가 아닌 어레이의 하위 집합을 테스트하는 데 좋은 솔루션입니다. 그러나 Arrays.equals (byte [], byte [])는 여기서 수행 한 거의 모든 작업을 수행합니다 (단, 동일한 객체 인 두 값을 더 효율적으로 처리하고 정상적으로 전달되는 null 배열을 처리 함). 커뮤니티에서 지원할 표준 라이브러리 구현을 사용하거나 영원히 지원해야하는 사용자 정의 구현을 작성하는 선택이 주어지면 매번 전자를 선택합니다.
Tom Dibble

4
대답은 두 개의 배열이 있고 배열을 먼저 복사하지 않고 바이트 범위를 비교하려는 사용 사례에 유용합니다. 배열 복사본은 오버 헤드를 추가하고 쓰레기를 추가하며 필요하지 않습니다. 내가 필요한 것은 저수준 c 스타일 memcmp () 였고 이것이 필요에 맞았습니다. 물론 memcmp ()는 길이 인수를 1 개만받습니다. 이 기능은 충분히 가깝습니다.
Bamaco

2

단위 테스트를 위해 두 배열을 비교하고 싶었고이 답변에 도달했기 때문에 공유 할 수 있다고 생각했습니다.

다음과 같이 할 수도 있습니다.

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

  Assert.assertArrayEquals(array, secondArray);
}

더 많은 정보 는 JUnit 어설 션의 배열 비교에서 확인할 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.