Frage

Wenn ich zwei byte[] Arrays haben, gibt es eine eingebaute Funktion sie ala C des memcmp() zu vergleichen?

War es hilfreich?

Lösung

Es gibt Arrays.equals ().

Ich weiß nicht, ob die JVM Implementierung dies tatsächlich optimiert, wenn eine entsprechende Anweisung in der Hardware vorhanden ist, aber ich bezweifle es.

Auch wenn ich meine C richtig erinnere, strcmp zu einem Nullabschlussarbeiten (es nützlich für die C-Strings zu machen), wird die Arrays Version das gesamte Array vergleichen, da Java-Programmierer selten Nullterminierte Arrays stören. Sie könnten Ihre eigene Funktion, wenn auch leicht schreiben, wenn Sie über den Null-Terminator kümmern.

Andere Tipps

memcmp gibt ein int, kleiner als, gleich oder größer als Null ist, wenn die ersten n Bytes von s1 gefunden wird, die jeweils als weniger, entsprechen oder größer sein als die ersten n Bytes s2. Equals gibt einen Booleschen. Es ist nicht die gleiche Funktion. Zusätzlich vergleicht memcmp Bytes als unsigned Zeichen.

ich denke, das könnte funktionieren:

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) In der Tat, die Ergänzung Teil der 2 ist nicht notwendig:

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

Nun, Arrays.equals() ist gut, aber kann nicht Teilbereiche vergleichen. In diesem Fall gibt es auch Weg durch Arrays.listOf() und später .subList() aber nicht für Primitiven wie byte[].

Eigentlich gibt es keine direkten memcmp() gleichwertig. Hier ist Diskussion und sobald ich weiß, es ist im gleichen Zustand jetzt (15 Jahre). Die meisten ‚native‘ Umsetzung könnte durch meine Wahl durch java.nio.ByteBuffer (wrap() Methode und dann equals()) erreicht werden. Aber es ist etwas große Menge an Code.

Für Menschen, den Gegenstand nicht vollständig verstehen: memcmp() wird in plattformabhängigen Art und Weise implementiert, die sehr effizient ist und nichts in Java nähert es zur Zeit. Eventuelle manuelle Zyklen sind weit, weit weg in der Bezeichnung der Leistung zumindest wegen der Indexbereich überprüft. Vielleicht haben die Leute ein paar Tage, die von Embedded C kam / C ++ wird zu diesem Thema erfüllt sein: -).

In Java 8, und wenn Sie auf OK Behandlung von Bytes als unsigned Wert, das ist, was C / C ++ memcmp tatsächlich tut:

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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top