相当于memcmp()in Java?
题
如果我有两个 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++会满意的关于这一主题:-).
[阵列。等于][1]
[1]: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Arrays.html#equals(byte[], 字节[])
在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;
}