Java の memcmp() に相当しますか?
質問
2つあれば byte[]
配列、C と比較するための組み込み関数はありますか memcmp()
?
解決
をArrays.equals()があります。
私は、対応する命令は、ハードウェアに存在する場合、JVMの実装は実際にこれを最適化するかどうか知らないが、私はそれを疑うます。
私は、ヌルターミネータ(C文字列のことが有用となる)までの作品のstrcmp、正しく私のCを覚えていればJavaプログラマはめったにnull終端配列を気にしないので、また、配列のバージョンは配列全体を比較します。あなたはNULL終止符を気にしている場合は、簡単に、しかし、あなた自身の関数を書くことができます。
他のヒント
Memcmpは、intを返しに等しい、より小さい、またはゼロより大きい。戻りブール値に等しいです。これは、同じ機能ではありません。また、memcmpは、符号なし文字としてバイトを比較します。
私はこの仕事ができると思います:
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;
}
(編集) 実際には、2の補数の部分は必要ありません。
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;
}
の java.util.Arrays.equals(byte[], byte[]) メソッドはあなたの友達です。
さて、Arrays.equals()
は良いですが、サブレンジを比較することはできません。この場合もArrays.listOf()
以降.subList()
介してではなくbyte[]
ようなプリミティブのパスがあります。
実際には直接memcmp()
相当はありません。ここでディスカッションにあるとすぐ私が知っているように、それは同じ状態であります今(15年)によります。ほとんどの「ネイティブ」の実装はjava.nio.ByteBuffer
(wrap()
方法と、その後equals()
)を介して、私のオプションによって達成することができました。しかし、それは、コードのやや大きな量である。
完全に主題を理解していない人のために:memcmp()
が現在それに近づいてJavaで非常に効率的で、何でプラットフォームに依存した方法で実装されています。手動サイクルは遠く離れ、少なくともためのインデックス範囲チェックのパフォーマンスの用語です。たぶんいつか組み込みCから来た人々/ C ++は、このトピックに満足されます: - 。)
[配列.等しい][1]
[1]: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Arrays.html#equals(byte[], 、バイト[])
のJava 8では、あなたは符号なしの値としてバイトを処理OKなら、C / C ++ memcmpが実際に何をするかである。
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;
}