web-dev-qa-db-fra.com

Comparez deux tableaux d'octets? (Java)

J'ai un tableau d'octets avec une séquence binaire ~ connue. Je dois confirmer que la séquence binaire est ce qu'elle est supposée être. J'ai essayé .equals en plus de ==, mais n'a pas fonctionné.

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

Dans votre exemple, vous avez:

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

Lorsque vous manipulez des objets, == In Java compare les valeurs de référence . Vous vérifiez si la référence au tableau renvoyée par toByteArray() est identique à la référence conservée dans array, elle ne peut bien sûr jamais être vraie. De plus, les classes de tableaux ne remplacent pas .equals() le comportement est donc celui de Object.equals() qui ne compare également que les valeurs de référence.

Pour comparer le contenu de deux tableaux, des méthodes de comparaison de tableaux statiques sont fournies par la classe Tableaux

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

Découvrez la statique Java.util.Arrays.equals() famille de méthodes. Il y en a un qui fait exactement ce que vous voulez.

63

Java ne surcharge pas les opérateurs, vous aurez donc généralement besoin d'une méthode pour les types non basiques. Essayez la méthode Arrays.equals () .

11
jswolf19

Vous pouvez utiliser à la fois Arrays.equals() et MessageDigest.isEqual(). Ces deux méthodes ont cependant quelques différences.

MessageDigest.isEqual() est une méthode de comparaison de constante de temps et Arrays.equals() n'est pas de constante de temps et peut entraîner des problèmes de sécurité si vous l'utilisez dans une application de sécurité.

Les détails de la différence peuvent être lus sur Arrays.equals () vs MessageDigest.isEqual ()

9
PixelsTech

Bien entendu, la réponse acceptée de Arrays.equal (octet [] en premier, octet [] seconde) est correcte. J'aime travailler à un niveau inférieur, mais je n'ai pas pu trouver de fonction efficace de bas niveau pour effectuer des tests d'égalité. Je devais préparer moi-même, si quelqu'un en avait besoin:

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

Puisque je voulais comparer deux tableaux pour un test unitaire et que je suis arrivé avec cette réponse, je pensais pouvoir le partager.

Vous pouvez aussi le faire avec:

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

  Assert.assertArrayEquals(array, secondArray);
}

Et vous pouvez vérifier Comparaison des tableaux dans les assertions JUnit pour plus d'informations.

0
Sylhare