2つのバイト配列を比較しますか?(Java)


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-先行ゼロ。その上、String / BigIntegerのものは、バイト配列比較の質問を説明するための方法にすぎません。
スティーブンC

compareToメソッドを使用してみましたか?BTWは==プリミティブ値をfyiだけで比較します
ChriskOlson

ここで比較する部分配列についての関連質問です:stackoverflow.com/questions/16646967/...
ヴァジム・

回答:


165

あなたの例では、あなたは:

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

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

2つの配列の内容を比較するために、静的配列比較メソッドが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()。ただし、これらの2つの方法にはいくつかの違いがあります。

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 [])は、ここで行ったほとんどすべてのことを正確に実行することに注意してください(同じオブジェクトである2つの値をより効率的に処理し、null配列が正常に渡される場合を除く)。コミュニティによってサポートされる標準ライブラリの実装を使用するか、永久にサポートする必要があるカスタム実装を作成するかを選択すると、毎回前者を選択します。
トムディブル2015

4
答えは、2つの配列があり、最初に配列のコピーを作成せずに、それらの配列からのバイトの範囲を比較したい場合に役立ちます。アレイのコピーはオーバーヘッドを追加し、ガベージを追加するため、必要ありません。私が必要としたのは低レベルのCスタイルのmemcmp()で、これはニーズに適合します。もちろん、memcmp()は長さ引数を1つだけ受け取ります。この機能は十分に近いです。
Bamaco、2015年

2

ユニットテストで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.