web-dev-qa-db-ja.com

2つのバイト配列を比較しますか? (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'");
}
92
Roger

あなたの例では、あなたが持っています:

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

オブジェクトを扱う場合、Javaの==は、参照値を比較しますtoByteArray()によって返される配列への参照がarrayに保持されている参照と同じかどうかを確認しています。さらに、配列クラスは.equals()をオーバーライドしないため、動作はObject.equals()の動作であり、参照値のみを比較します。

2つの配列のcontentsを比較するために、静的配列比較メソッドが Arrays class

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

静的な Java.util.Arrays.equals() ファミリのメソッドを確認してください。まさにあなたが望むことをするものがあります。

63

Javaは演算子をオーバーロードしないため、通常は非基本型のメソッドが必要になります。 Arrays.equals() メソッドを試してください。

11
jswolf19

Arrays.equals()MessageDigest.isEqual()の両方を使用できます。ただし、これら2つの方法にはいくつかの違いがあります。

MessageDigest.isEqual()は時定数の比較方法であり、Arrays.equals()は時定数ではないため、セキュリティアプリケーションで使用するとセキュリティ上の問題が発生する可能性があります。

違いの詳細は Arrays.equals()vs MessageDigest.isEqual() で読むことができます

9
PixelsTech

もちろん、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;
}
3
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アサーションの配列の比較 で確認できます。

0
Sylhare