Java中的memcmp()等价物?

Java中的memcmp()等价物?,java,c,posix,libc,memcmp,Java,C,Posix,Libc,Memcmp,如果我有两个byte[]数组,是否有一个内置函数将它们与C的memcmp()进行比较?有数组。equals() 如果硬件中存在相应的指令,我不知道JVM实现是否真的对此进行了优化,但我对此表示怀疑 此外,如果我正确地记住了我的C,strcmp可以使用空终止符(这对C字符串很有用),数组版本将比较整个数组,因为Java程序员很少使用空终止数组。不过,如果您关心空终止符,就可以轻松编写自己的函数 [Arrays.equals][1] [1] :,byte[])该方法是您的朋友。好吧,数组.equal

如果我有两个
byte[]
数组,是否有一个内置函数将它们与C的
memcmp()
进行比较?

有数组。equals()

如果硬件中存在相应的指令,我不知道JVM实现是否真的对此进行了优化,但我对此表示怀疑

此外,如果我正确地记住了我的C,strcmp可以使用空终止符(这对C字符串很有用),数组版本将比较整个数组,因为Java程序员很少使用空终止数组。不过,如果您关心空终止符,就可以轻松编写自己的函数

[Arrays.equals][1]

[1] :,byte[])

该方法是您的朋友。

好吧,
数组.equals()
很好,但无法比较子范围。在这种情况下,还存在通过
数组.listOf()
和更高版本的
.subList()
的路径,但不适用于像
字节[]
这样的原语

实际上没有直接的
memcmp()
等价物。这就是我所知道的,到现在(15年)它处于相同的状态。大多数“本机”实现可以通过我的选择通过
java.nio.ByteBuffer
wrap()
方法,然后
equals()
)实现。但它的代码量有点大


对于完全不理解这个主题的人:
memcmp()
是以依赖于平台的方式实现的,这种方式非常有效,Java中目前还没有任何东西可以实现它。至少由于索引范围检查,任何手动循环在性能方面都相去甚远。也许有一天,来自嵌入式C/C++的人们会对这个主题感到满意:-),如果P1的MN,第一个N个字节分别小于,匹配,或者大于S2的第一个N字节,则MINCMP返回一个小于、等于或大于零的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;
}
public int memcmp(字节b1[],字节b2[],int sz){
对于(int i=0;i=0&&b2[i]>=0)
返回b1[i]-b2[i];
如果(b1[i]<0&&b2[i]>=0)
返回1;
如果(b2[i]<0&&b1[i]>=0)
返回-1;
if(b1[i]<0&&b2[i]<0){
字节x1=(字节)(256+b1[i]);
字节x2=(字节)(256+b2[i]);
返回x1-x2;
}
}
}
返回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;
}
publicstaticintmemcmp(字节b1[],字节b2[],intsz){
对于(int i=0;i=0&&b2[i]>=0)| |(b1[i]<0&&b2[i]<0))
返回b1[i]-b2[i];
如果(b1[i]<0&&b2[i]>=0)
返回1;
如果(b2[i]<0&&b1[i]>=0)
返回-1;
}
}
返回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;
}
private static int memcmp(字节[]a,字节[]b,int sz){
对于(int i=0;i
我很好奇有人会在JavaI中用null终止自己的数组,我从未尝试过,但我假设如果有人调用C中的本机方法并使用缓冲区……strcmp从何而来?问题是关于memcmp的,我在编辑历史记录中也看不到strcmp。在手册页中:“如果发现s1的前n个字节分别小于、匹配或大于s2的前n个字节,则memcmp()函数返回小于、等于或大于零的整数。”array.equals()没有给出哪个更大的任何指示。加1表示子范围。在这种情况下,可以将
Arrays.copyOfRange()
Arrays.equals()
一起使用,但无论如何可能都没有效率。return 1和return-1不是相反吗?