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'");
}
Roger
sumber
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!");
}
Brian Roach
sumber
64

Lihat java.util.Arrays.equals()keluarga metode statis . Ada satu yang melakukan apa yang Anda inginkan.

Ernest Friedman-Hill
sumber
11

Java tidak membebani operator, jadi biasanya Anda memerlukan metode untuk tipe non-dasar. Coba metode Arrays.equals () .

jswolf19
sumber
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 ()

PixelsTech
sumber
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;
}
Bamaco
sumber
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.

Sylhare
sumber