Question

Si j'ai deux tableaux de byte[], est-il une fonction intégrée pour les comparer ala de memcmp() de C?

Était-ce utile?

La solution

Il y a Arrays.equals ().

Je ne sais pas si la mise en œuvre JVM optimise réellement cela si une instruction correspondante existe dans le matériel, mais je doute.

En outre, si je me souviens de mon C correctement, strcmp fonctionne jusqu'à une terminaison nulle (ce qui est utile pour les chaînes C), la version Arrays comparera l'ensemble du réseau depuis les programmeurs Java dérangent rarement avec des tableaux à zéro terminal. Vous pouvez facilement écrire votre propre fonction, bien que, si vous vous souciez de la terminaison null.

Autres conseils

memcmp retourne un entier, inférieur à, égal à, ou supérieur à zéro si les n premiers octets de s1 se trouve, respectivement, pour être moins, pour correspondre à, ou être plus grande que les n premiers octets de s2. Equals retourne un booléen. Ce n'est pas la même fonction. De plus, memcmp compare octets que les caractères non signés.

Je pense que cela pourrait fonctionner:

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;
}

(modifier) En fait, la partie du complément du 2 n'est pas nécessaire:

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;
}

Eh bien, Arrays.equals() est bon, mais ne peut pas comparer les sous-domaines. Dans ce cas, il y a aussi chemin à travers Arrays.listOf() et .subList() plus tard, mais pas pour les primitives comme byte[].

En fait, il n'y a pas d'équivalent memcmp() direct. Voici et dès que je sais qu'il est dans le même état par maintenant (15 ans). La plupart mise en œuvre « indigène » pourrait être atteint par mon option par java.nio.ByteBuffer (méthode wrap() puis equals()). Mais il est un peu grande quantité de code.

Pour les personnes qui ne comprennent pas entièrement l'objet: memcmp() est mis en œuvre la plate-forme de façon dépendante qui est très efficace et rien en Java approchant actuellement il. Tous les cycles manuels sont très loin en terme de performance au moins en raison des contrôles de plage d'index. Peut-être que certaines personnes de jour qui sont venus de embarqués C / C ++ seront satisfaits à ce sujet: -.)

En Java 8, et si vous êtes OK octets traiter comme des valeurs non signées, ce qui est ce que C / C ++ memcmp ne fait:

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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top