Pergunta

Se eu tiver duas matrizes byte[], há um built-in função para compará-los ala memcmp() de C?

Foi útil?

Solução

Há Arrays.equals ().

Eu não sei se a implementação JVM realmente otimiza este se uma instrução correspondente existe no hardware, mas eu duvido.

Além disso, se eu lembro do meu C corretamente, strcmp funciona até um terminador nulo (tornando-o útil para strings C), A versão Arrays irá comparar a matriz inteira desde programadores Java raramente se preocupar com matrizes de terminação nula. Você poderia facilmente escrever sua própria função, no entanto, se você se preocupa com o nulo terminador.

Outras dicas

memcmp retorna um int, menos do que, igual a, ou maior do que zero se os primeiros n bytes de S1 se encontra, respectivamente, para ser menor que, para corresponder, ou ser maior do que o primeiro n bytes de S2. Equals Retorna um booleano. Não é a mesma função. Além disso, memcmp compara bytes como caracteres sem sinal.

Eu acho que isso poderia 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) Na verdade, a 2 de parte complemento não é necessário:

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

Bem, Arrays.equals() é bom, mas não se pode comparar subranges. Neste caso também há caminho através Arrays.listOf() e .subList() mais tarde, mas não para primitivos como byte[].

Na verdade não há memcmp() equivalente direto. Aqui está discussão e assim que eu sei que é no mesmo estado por agora (15 anos). A maioria implementação 'nativo' poderia ser alcançado por minha opção através java.nio.ByteBuffer (método wrap() e depois equals()). Mas é um pouco grande quantidade de código.

Para as pessoas que totalmente não entendem assunto: memcmp() é implementado na plataforma de maneira dependente que é muito eficiente e nada em Java que se aproxima atualmente. Quaisquer ciclos manuais são muito longe em termos de desempenho, pelo menos, por causa do alcance do índice controlos. Talvez algum dia as pessoas que vieram de embutido C / C ++ serão satisfeitos sobre este assunto: -).

Em Java 8, e se você estiver OK tratamento bytes como valores não assinados, que é o C / C ++ memcmp realmente faz:

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top