質問

2つあれば byte[] 配列、C と比較するための組み込み関数はありますか memcmp() ?

役に立ちましたか?

解決

をArrays.equals()があります。

私は、対応する命令は、ハードウェアに存在する場合、JVMの実装は実際にこれを最適化するかどうか知らないが、私はそれを疑うます。

私は、ヌルターミネータ(C文字列のことが有用となる)までの作品のstrcmp、正しく私のCを覚えていればJavaプログラマはめったにnull終端配列を気にしないので、

また、配列のバージョンは配列全体を比較します。あなたはNULL終止符を気にしている場合は、簡単に、しかし、あなた自身の関数を書くことができます。

他のヒント

S1の最初のnバイトが一致、またはS2の最初のnバイトよりも大きく、より小さくなるように、それぞれ、検出された場合、

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.ByteBufferwrap()方法と、その後equals())を介して、私のオプションによって達成することができました。しかし、それは、コードのやや大きな量である。

完全に主題を理解していない人のために:memcmp()が現在それに近づいてJavaで非常に効率的で、何でプラットフォームに依存した方法で実装されています。手動サイクルは遠く離れ、少なくともためのインデックス範囲チェックのパフォーマンスの用語です。たぶんいつか組み込みCから来た人々/ C ++は、このトピックに満足されます: - 。)

の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;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top