相当于Java中的memcmp()?

Jas*_*n S 9 c java posix libc memcmp

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

eso*_*ano 6

如果发现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;
}
Run Code Online (Sandbox Code Playgroud)

(编辑)事实上,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;
}
Run Code Online (Sandbox Code Playgroud)


Uri*_*Uri 4

有Arrays.equals()。

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

另外,如果我没记错我的 C,strcmp 会工作到一个空终止符(使其对 C 字符串有用),数组版本将比较整个数组,因为 Java 程序员很少为空终止数组而烦恼。不过,如果您关心空终止符,您可以轻松编写自己的函数。

  • strcmp从哪里来?问题是关于 memcmp 的,我在编辑历史记录中也看不到 strcmp 。 (5认同)