Domanda

Se ho due array byte[], c'è una funzione built-in per confrontare ala memcmp() di C di loro?

È stato utile?

Soluzione

C'è Arrays.equals ().

Non so se l'attuazione JVM in realtà ottimizza questo se un corrispondente di istruzioni esiste nel hardware, ma ne dubito.

Inoltre, se non ricordo male il mio C, strcmp funziona fino ad un terminatore null (che lo rende utile per le stringhe C), La versione Array confronterà l'intero array in quanto i programmatori Java raramente si preoccupano con array null-terminated. Si potrebbe facilmente scrivere la propria funzione, però, se vi preoccupate per il nulla-terminator.

Altri suggerimenti

memcmp restituisce un int, inferiore, uguale o superiore a zero se i primi n byte di s1 è trovato, rispettivamente, di essere meno, da abbinare, o essere superiore ai primi n byte di s2. Uguale ritorna un valore booleano. Non è la stessa funzione. Inoltre, memcmp confronta byte come caratteri senza segno.

Credo che questo potrebbe funzionare:

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

(modifica) In realtà, il 2 della parte complemento non è necessario:

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

Bene, Arrays.equals() è buono, ma non si può paragonare sottocampi. In questo caso v'è anche percorso attraverso Arrays.listOf() e .subList() più tardi, ma non per i primitivi come byte[].

In realtà non v'è alcuna memcmp() equivalente diretto. Ecco e non appena so che è nello stesso stato ormai (15 anni). La maggior parte implementazione 'nativa' potrebbe essere raggiunto attraverso la mia opzione attraverso java.nio.ByteBuffer (metodo wrap() e poi equals()). Ma è un po 'grande quantità di codice.

Per le persone che completamente non capiscono soggetto: memcmp() è implementata in modo dipendente piattaforma che è molto efficiente e niente in Java attualmente si avvicina. Eventuali cicli manuali sono molto lontani in termini di prestazioni almeno a causa del test di ricezione dell'indice. Forse alcune persone al giorno che venivano da embedded C / C ++ saranno soddisfatti su questo argomento: -).

In Java 8, e se siete byte trattare OK come valori senza segno, che è ciò che C / C ++ memcmp in realtà fa:

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top