相当于Java中的memcmp()?

时间:2009-07-07 02:29:28

标签: java c posix libc memcmp

如果我有两个byte[]数组,是否有内置函数来比较ala C的memcmp()

6 个答案:

答案 0 :(得分:5)

如果发现s1的前n个字节分别小于,匹配或大于s2的前n个字节,则memcmp返回小于,等于或大于零的int。 Equals返回一个布尔值。这不是同一个功能。此外,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;
}

答案 1 :(得分:4)

有Arrays.equals()。

我不知道如果硬件中存在相应的指令,JVM实现是否会实际优化它,但我对此表示怀疑。

另外,如果我正确地记住了我的C,strcmp可以使用空终止符(使其对C字符串有用),Arrays版本将比较整个数组,因为Java程序员很少使用以null结尾的数组。但是,如果你关心null终止符,你可以轻松编写自己的函数。

答案 2 :(得分:2)

java.util.Arrays.equals(byte[], byte[])方法是你的朋友。

答案 3 :(得分:1)

嗯,Arrays.equals()很好,但无法比较子范围。在这种情况下,还有Arrays.listOf()和更晚.subList()的路径,但不是byte[]等原语。

实际上没有直接的memcmp()等价物。这是discussion,我知道它现在处于同一状态(15年)。我可以通过java.nio.ByteBufferwrap()方法,然后equals())来实现大多数“原生”实施。但它的代码量有点大。

对于完全不理解主题的人:memcmp()是以平台相关的方式实现的,这是非常有效的,并且Java当前没有接近它。至少由于指数范围检查,任何手动周期在性能方面都很遥远。也许有一天来自嵌入式C / C ++的人会对这个话题感到满意: - )。

答案 4 :(得分:0)

答案 5 :(得分:0)

在Java 8中,如果您可以将字节视为无符号值,那么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;
}