Tengo una matriz de bytes con un ~conocida secuencia binaria en ella. Necesito confirmar que la secuencia binaria que es lo que se supone debería ser. He intentado .equals además ==, pero tampoco funcionó.

byte[] array = new BigInteger("1111000011110001", 2).toByteArray();
if (new BigInteger("1111000011110001", 2).toByteArray() == array){
    System.out.println("the same");
} else {
    System.out.println("different'");
}
  • usted puede simplemente comparar las cadenas directamente?
  • los ceros a la izquierda. Además, la Cadena / BigInteger cosas podría ser simplemente una forma de ilustrar la matriz de bytes de comparación de que se trate.
  • Has probado a utilizar el método compareTo? BTW == compara los valores primitivos sólo para tu información
  • Aquí está relacionada con la pregunta acerca parcial de la matriz de comparación: stackoverflow.com/questions/16646967/…
InformationsquelleAutor Roger | 2011-03-26

6 Comentarios

  1. 161

    En el ejemplo, se tiene:

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

    Cuando se trata de objetos, == en java compara valores de referencia. Estás revisando para ver si la referencia a la matriz devuelta por toByteArray() es la misma que la referencia que se mantiene en array, que por supuesto nunca puede ser verdad. Además, la matriz de clases no anula .equals() por lo que el comportamiento es el de Object.equals() que también sólo compara los valores de referencia.

    Para comparar la contenido de dos matrices, la estática de la matriz de comparación de los métodos proporcionados por la Matrices de clase

    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!");
    }
  2. 9

    Puede utilizar tanto Arrays.equals() y MessageDigest.isEqual(). Estos dos métodos tienen algunas diferencias, aunque.

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

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

  3. 3

    Por supuesto, la aceptación de respuesta de Matrices.la igualdad( byte[] en primer lugar, byte[] segundo ) es correcta.
    Me gusta trabajar en un nivel inferior, pero yo era incapaz de encontrar un bajo nivel eficiente de la función a realizar la prueba de la igualdad de rangos. Tuve que preparar mi propia cuenta, si alguien la 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;
    }
    • Esta es una buena solución para pruebas de un subconjunto de las matrices en lugar de la cosa entera. Sin embargo, tenga en cuenta que las Matrices.es igual a(byte[], byte[]) hace casi exactamente todo lo que hice aquí (excepto controla los dos valores en el mismo objeto de manera más eficiente, y se encarga de null matrices que se pasa en gracia). Cuando se les da la opción de usar un estándar de implementación de la biblioteca, que será financiado por la comunidad o la escritura de una implementación personalizada de lo que voy a necesitar apoyo para siempre, yo te elegí el primero en todo momento.
    • Exactamente lo que Tom Dibble, dice. Por favor, copia de seguridad de su respuesta de una manera o de eliminarla…
    • La respuesta es útil para el caso de uso donde se tienen dos matrices y desea comparar el rango de bytes de ellos, sin necesidad de hacer copias de las matrices. Matriz de copias agregar una sobrecarga, agregar la basura, y no son necesarios. Lo que necesitaba era un bajo nivel de estilo de c memcmp() y esto se ajusta a la necesidad. Por supuesto, memcmp() toma sólo 1 longitud del argumento. Esta función está lo suficientemente cerca.
  4. 1

    Desde quería comparar dos matrices para una unidad de Prueba y llegué a esta respuesta pensé que podría compartir.

    También se puede hacer con:

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

    Y se puede comprobar en La comparación de las matrices de JUnit afirmaciones para más información.

Dejar respuesta

Please enter your comment!
Please enter your name here