Java에서 memcmp ()와 동등합니까?
문제
내가 두 사람이 있다면 byte[]
배열, Ala C를 비교할 수있는 내장 기능이 있습니까? memcmp()
?
해결책
Arrays.equals ()가 있습니다.
하드웨어에 해당 명령이 존재하는 경우 JVM 구현이 실제로이를 최적화하는지 여부는 모르겠지만 의심합니다.
또한 C를 올바르게 기억하면 strcmp는 널 터미네이터까지 작동합니다 (C 문자열에 유용하게 함). 배열 버전은 Java 프로그래머가 Null-Terminated 배열과 거의 신경 쓰지 않기 때문에 전체 배열을 비교합니다. 그러나 Null-Terminator에 관심이 있다면 자신의 기능을 쉽게 쓸 수 있습니다.
다른 팁
MEMCMP는 S1의 첫 번째 N 바이트가 각각 S2의 첫 번째 N 바이트보다 더 큰 것으로 밝혀지는 경우 각각 S1의 첫 번째 N 바이트보다 int, 동일 또는 또는 0보다 큰 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;
}
(편집) 실제로, 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.util.arrays.equals (byte [], byte []) 방법은 당신의 친구입니다.
잘, Arrays.equals()
좋지만 서브 랑을 비교할 수는 없습니다. 이 경우에도 경로가 있습니다 Arrays.listOf()
그리고 나중에 .subList()
그러나 프리미티브와 같은 것은 아닙니다 byte[]
.
실제로 직접적인 것은 없습니다 memcmp()
동등한. 여기에 있습니다 논의 그리고 내가 알게 되 자마자 지금까지 (15 년) 같은 상태에 있습니다. 대부분의 '기본'구현은 내 옵션을 통해 달성 할 수 있습니다. java.nio.ByteBuffer
(wrap()
방법 및 그런 다음 equals()
). 그러나 그것은 다소 많은 양의 코드입니다.
주제를 완전히 이해하지 못하는 사람들을 위해 : memcmp()
플랫폼 종속 방식으로 구현되어 매우 효율적이며 현재 접근하는 Java에서는 아무것도 없습니다. 모든 수동주기는 인덱스 범위 검사로 인해 성능 측면에서 멀리 떨어져 있습니다. 어쩌면 언젠가 내장 된 C / C ++에서 온 사람들은이 주제에 대해 만족할 것입니다 :-).
Arrays.equals] [1
[1]: http://java.sun.com/j2se/1.5.0/docs/api/java/util/arrays.html#equals (byte [, 바이트 [])
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;
}