如果我有两个 byte[] 阵列,是有一个建立功能比较它们ala C的 memcmp() ?

有帮助吗?

解决方案

有阵列。等().

我不知道是否JVM执行实际优化此,如果一个相应的指令存在于硬件,但我对此表示怀疑。

此外,如果我记得我正确,strcmp工作达到空终止(使其成为有用的C strings),该阵版本将在比较整个阵列,因为Java程序员很少打扰空终止阵列。你可以很容易地编写自己的功能,不过,如果你关心的null-终结者。

其他提示

Memcmp返回int、小于等于或大于零,如果第n字节的s1发现,分别为小于配合,或大于第n字节的s2。等于返回布尔。这是不一样的功能。此外,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。工具.阵列。等(byte[],byte[]) 方法是你的朋友。

好了, Arrays.equals() 是好的,但不能比较子范围。在这种情况下也是路过 Arrays.listOf() 和之后 .subList() 但不元喜欢 byte[].

实际上没有直接 memcmp() 相当。这里是 讨论 只要我知道这是在同一个国家现在通过(15岁)。最'当地'落实可能是通过我选择通过 java.nio.ByteBuffer (wrap() 方法,然后 equals()).但它是有些大量的代码。

人们完全不理解的主题: memcmp() 实现在平台相关的方式,这是非常有效的和没有在Java目前接近。任何人工周期远远在期限性能至少因为指标的范围内检查。也许有一天人来自嵌入C/C++会满意的关于这一主题:-).

在Java8,如果你确定治疗字节的无符号的价值观,这是什么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