2011-03-26 30 views
77

Tengo una matriz de bytes con una ~ secuencia binaria conocida en ella. Necesito confirmar que la secuencia binaria es lo que se supone que es. He intentado .equals además de ==, pero ninguno funcionó.¿Comparar dos matrices de bytes? (Java)

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

puede simplemente comparar las cadenas directamente? – objects

+1

@objects - ceros a la izquierda. Además, las cosas de String/BigInteger podrían ser solo una forma de ilustrar la pregunta de comparación de matriz de bytes. –

+0

¿Ha intentado utilizar el método compareTo? BTW '==' compara valores primitivos simplemente fyi – ChriskOlson

Respuesta

143

En su ejemplo, usted tiene:

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

Cuando se trata de objetos, == en Java compara valores de referencia. Está comprobando si la referencia a la matriz devuelta por toByteArray() es la misma que la referencia que se encuentra en array, que, por supuesto, nunca puede ser cierta. Además, las clases de matriz no anulan .equals(), por lo que el comportamiento es el de Object.equals(), que también solo compara los valores de referencia.

para comparar la contenido de dos matrices, los métodos de comparación matriz estática son proporcionados por el 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!"); 
} 
56

Echa un vistazo a la familia de métodos estáticos java.util.Arrays.equals(). Hay uno que hace exactamente lo que quieres.

11

Java no sobrecarga los operadores, por lo que normalmente necesitará un método para tipos no básicos. Pruebe el método Arrays.equals().

3

Por supuesto, la respuesta aceptada de Arrays.equal (byte [] primero, byte [] segundo) es correcto. Me gusta trabajar en un nivel inferior, pero no pude encontrar una función eficiente de bajo nivel para realizar rangos de prueba de igualdad. Tuve que azotar encima de la mía, si alguien lo necesita:

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

Esta es una buena solución para probar un subconjunto de las matrices en lugar de todo. Sin embargo, tenga en cuenta que Arrays.equals (byte [], byte []) hace prácticamente todo lo que hizo aquí (excepto que maneja los dos valores siendo el mismo objeto de manera más eficiente, y maneja matrices nulas que se pasan con gracia). Cuando se me dé la opción de usar una implementación de biblioteca estándar que sea compatible con la comunidad o escribir una implementación personalizada de la misma que necesitaré para siempre, elegiré la primera siempre. –

+0

Exactamente lo que dice Tom Dibble. Haga una copia de seguridad de su respuesta o elimínela ... –

+4

La respuesta es útil para el caso de uso en el que uno tiene dos matrices y desea comparar el rango de bytes de ellas, sin hacer primero copias de las matrices. Las copias de matriz agregan sobrecarga, agregan basura y no son necesarias. Lo que necesitaba era un memcmp estilo c de bajo nivel() y esto se ajusta a la necesidad.Por supuesto, memcmp() toma solo 1 argumento de longitud. Esta función es lo suficientemente cerca. – Bamaco

8

Se puede utilizar tanto Arrays.equals() y MessageDigest.isEqual(). Sin embargo, estos dos métodos tienen algunas diferencias.

MessageDigest.isEqual() es un método de comparación constante de tiempo y Arrays.equals() no es constante en el tiempo y puede traer algunos problemas de seguridad si lo usa en una aplicación de seguridad.

Los detalles de la diferencia se puede leer en Arrays.equals() vs MessageDigest.isEqual()

Cuestiones relacionadas