Bandingkan dua Byte Array? (Jawa)


96

Saya memiliki array byte dengan ~ urutan biner yang dikenal di dalamnya. Saya perlu mengonfirmasi bahwa urutan biner adalah sebagaimana mestinya. Saya telah mencoba .equalssebagai tambahan ==, tetapi tidak ada yang berhasil.

byte[] array = new BigInteger("1111000011110001", 2).toByteArray();
if (new BigInteger("1111000011110001", 2).toByteArray() == array){
    System.out.println("the same");
} else {
    System.out.println("different'");
}

bisakah Anda membandingkan string secara langsung?
objek

1
@objects - nol di depan. Selain itu, hal-hal String / BigInteger hanya bisa menjadi cara untuk menggambarkan pertanyaan perbandingan byte-array.
Stephen C

Sudahkah Anda mencoba menggunakan metode bandingkanTo? BTW ==membandingkan nilai primitif hanya
diketahui

Berikut pertanyaan terkait tentang perbandingan array parsial: stackoverflow.com/questions/16646967/…
Vadzim

Jawaban:


167

Dalam contoh Anda, Anda memiliki:

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

Saat berhadapan dengan objek, ==di java membandingkan nilai referensi . Anda memeriksa untuk melihat apakah referensi ke larik yang dikembalikan oleh toByteArray()sama dengan referensi yang dipegang array, yang tentu saja tidak akan pernah benar. Selain itu, kelas array tidak menimpa .equals()sehingga perilakunya Object.equals()juga hanya membandingkan nilai referensi.

Untuk membandingkan isi dari dua array, metode perbandingan array statis disediakan oleh kelas Array

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

Anda dapat menggunakan keduanya Arrays.equals()dan MessageDigest.isEqual(). Kedua metode ini memiliki beberapa perbedaan.

MessageDigest.isEqual()adalah metode perbandingan waktu konstan dan Arrays.equals()non waktu konstan dan mungkin membawa beberapa masalah keamanan jika Anda menggunakannya dalam aplikasi keamanan.

Detail untuk perbedaannya dapat dibaca di Arrays.equals () vs MessageDigest.isEqual ()


3

Tentu saja, jawaban yang diterima dari Arrays.equal (byte [] pertama, byte [] detik) benar. Saya suka bekerja di level yang lebih rendah, tetapi saya tidak dapat menemukan fungsi efisien level rendah untuk melakukan rentang uji kesetaraan. Saya harus menyiapkan sendiri, jika ada yang membutuhkan:

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;
}

Ini adalah solusi yang baik untuk menguji subset dari array daripada keseluruhannya. Namun, perhatikan bahwa Arrays.equals (byte [], byte []) melakukan hampir semua yang Anda lakukan di sini (kecuali menangani dua nilai menjadi objek yang sama secara lebih efisien, dan menangani array null yang diteruskan dengan anggun). Ketika diberi pilihan untuk menggunakan implementasi perpustakaan standar yang akan didukung oleh komunitas atau menulis implementasi kustomnya yang akan saya dukung selamanya, saya akan memilih yang pertama setiap saat.
Tom Dibble

4
Jawabannya berguna untuk kasus penggunaan di mana seseorang memiliki dua array dan ingin membandingkan rentang byte darinya, tanpa terlebih dahulu membuat salinan dari array tersebut. Salinan array menambah overhead, menambah sampah, dan tidak diperlukan. Yang saya butuhkan adalah memcmp () gaya c level rendah dan ini sesuai dengan kebutuhan. Tentu saja, memcmp () hanya membutuhkan 1 argumen panjang. Fungsi ini cukup dekat.
Bamaco

2

Karena saya ingin membandingkan dua array untuk Tes unit dan saya sampai pada jawaban ini, saya pikir saya bisa berbagi.

Anda juga dapat melakukannya dengan:

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

  Assert.assertArrayEquals(array, secondArray);
}

Dan Anda dapat memeriksa Membandingkan array di pernyataan JUnit untuk info lebih lanjut.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.