문제

내가 두 사람이 있다면 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 ++에서 온 사람들은이 주제에 대해 만족할 것입니다 :-).

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;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top