Entsprechendes von memcmp () in Java?

8

Wenn ich zwei byte[] -Arrays habe, gibt es eine eingebaute Funktion, um sie zu vergleichen mit% c_de%?

von C     
Jason S 07.07.2009, 02:29
quelle

5 Antworten

5

Es gibt Arrays.equals ().

Ich weiß nicht, ob die JVM-Implementierung dies tatsächlich optimiert, wenn ein entsprechender Befehl in der Hardware existiert, aber ich bezweifle es.

Auch, wenn ich mich richtig an C erinnere, arbeitet strcmp mit einem Null-Terminator (was für C-Strings nützlich ist). Die Array-Version vergleicht das gesamte Array, da Java-Programmierer sich selten mit nullterminierten Arrays befassen. Sie können jedoch leicht Ihre eigene Funktion schreiben, wenn Sie sich für den Null-Terminator interessieren.

    
Uri 07.07.2009, 02:31
quelle
5

Memcmp gibt einen int, kleiner als, gleich oder größer als null zurück, wenn die ersten n Bytes von s1 jeweils kleiner als, passend oder größer als die ersten n Bytes von s2 sind. Equals gibt einen booleschen Wert zurück. Es ist nicht die gleiche Funktion. Darüber hinaus vergleicht Memcmp Bytes als unsigned Zeichen.

Ich denke, das könnte funktionieren:

%Vor%

(bearbeiten) In der Tat ist der Zweierkomplementteil nicht notwendig:

%Vor%     
esoriano 07.09.2013 20:26
quelle
2

Die java.util.Arrays.equals (byte [], byte []) Methode ist dein Freund.

    
lavinio 07.07.2009 02:47
quelle
1

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

Tatsächlich gibt es kein direktes memcmp() Äquivalent. Hier ist Diskussion und sobald ich weiß, ist es im selben Zustand (15 Jahre) ). Die meisten 'nativen' Implementierungen könnten durch meine Option über java.nio.ByteBuffer ( wrap() method und dann equals() ) erreicht werden. Aber es ist etwas viel Code.

Für Leute, die das Thema völlig nicht verstehen: memcmp() ist plattformabhängig implementiert, was sehr effizient ist und nichts in Java, das sich ihm nähert. Alle manuellen Zyklen sind mindestens aufgrund der Indexbereichsüberprüfungen in Bezug auf die Leistung weit entfernt. Vielleicht werden eines Tages Leute, die von embedded C / C ++ kommen, zu diesem Thema zufrieden sein :-).

    
Roman Nikitchenko 20.05.2013 13:16
quelle
0

[Arrays.equals] [1]

[1]: Ссылка , Byte [])

    
oscarkuo 07.07.2009 02:32
quelle

Tags und Links