Pregunta

Si tengo dos matrices byte[], no es una función incorporada para compararlos ala memcmp() de C?

¿Fue útil?

Solución

Hay Arrays.equals ().

No sé si la implementación JVM realidad optimiza esto si existe una instrucción correspondiente en el hardware, pero lo dudo.

Además, si no recuerdo mi C correctamente, strcmp funciona hasta un terminador nulo (por lo que es útil para cadenas de C), la versión matrices comparará toda la matriz ya que los programadores de Java rara vez se molestan con matrices de terminación nula. Desde aquí se puede escribir su propia función, sin embargo, si usted se preocupa por el terminador nulo.

Otros consejos

memcmp devuelve un int, menor que, igual a, o mayor que cero si se encontraron los primeros n bytes de s1, respectivamente, para ser menor que, para que coincida con, o ser mayor que los primeros n bytes de s2. Igual devuelve un booleano. No es la misma función. Además, memcmp compara bytes como caracteres sin signo.

Creo que esto podría funcionar:

public int memcmp(byte b1[], byte b2[], int sz){
    for(int i = 0; i < sz; i++){
        if(b1[i] != b2[i]){
            if(b1[i] >= 0 && b2[i] >= 0)
                return b1[i] - b2[i];
            if(b1[i] < 0 && b2[i] >= 0)
                return 1;
            if(b2[i] < 0 && b1[i] >= 0)
                return -1;
            if(b1[i] < 0 && b2[i] < 0){
                byte x1 = (byte) (256 + b1[i]);
                byte x2 = (byte) (256 + b2[i]);
                return x1 - x2;
            }
        }
    }
    return 0;
}

(edit) De hecho, de la parte 2 del complemento no es necesaria:

public static int memcmp(byte b1[], byte b2[], int sz){
    for(int i = 0; i < sz; i++){
        if(b1[i] != b2[i]){
            if((b1[i] >= 0 && b2[i] >= 0)||(b1[i] < 0 && b2[i] < 0))
                return b1[i] - b2[i];
            if(b1[i] < 0 && b2[i] >= 0)
                return 1;
            if(b2[i] < 0 && b1[i] >=0)
                return -1;
        }
    }
    return 0;
}

Bueno, Arrays.equals() es bueno, pero no se puede comparar sub-intervalos. En este caso también hay camino a través de Arrays.listOf() y más tarde .subList() pero no para las primitivas como byte[].

En realidad no existe un equivalente memcmp() directa. Aquí es y tan pronto como sé que está en el mismo estado por ahora (15 años). La mayor aplicación 'nativo' se podría lograr a través de mi opción java.nio.ByteBuffer (método wrap() y luego equals()). Pero es un poco grande cantidad de código.

Para las personas, que totalmente no entienden Asunto: memcmp() se implementa en forma dependiente de la plataforma, que es muy eficiente y nada en Java actualmente acercarse a ella. Cualquier ciclos manuales son muy, muy lejos en términos de desempeño al menos a causa de cheques intervalo de índice. Tal vez algún día la gente que vino de C incrustado / C ++ estarán satisfechos sobre este tema: -).

En Java 8, y si eres bytes tratan como valores sin signo OK, que es lo que C / C ++ memcmp hace realidad:

private static int memcmp(byte[] a, byte[] b, int sz) {
    for (int i = 0; i < sz; i++) {
        if (a[i] != b[i]) {
            return Byte.toUnsignedInt(a[i]) - Byte.toUnsignedInt(b[i]);
        }
    }
    return 0;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top