9
votes

équivalent de memcmp () en Java?

Si j'ai deux byte [] sont une fonction intégrée pour les comparer au MEMCMP (code> MEMCMP () d'ALA C ()


0 commentaires

6 Réponses :


4
votes

Il y a des tableaux.equaux ().

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

En outre, si je me souviens de mon C correctement, STRCMP fonctionne jusqu'à un terminateur NULL (ce qui est utile pour les chaînes C), la version des tableaux comparera la totalité du tableau car Java Les programmeurs se préoccupent rarement des matrices de terminaison NULL. Vous pouvez facilement écrire votre propre fonction, si vous vous souciez de la terminaison NULL.


4 commentaires

Je suis curieux pour un cas où quelqu'un serait null terminer leur propre tableau en Java


Je n'ai jamais essayé cela, mais je suppose que peut-être que si on a invoqué une méthode natale en C et utilisé un tampon ...


D'où vient STRCMP? La question portait sur MEMCMP, et je ne peux pas voir STRCMP dans les histoires d'édition non plus.


De la page man: "La fonction MEMCMP () renvoie un entier inférieur à, égal ou supérieur à zéro si les n octets de S1 de S1 sont trouvés, respectivement, être inférieur à, ou être supérieur au premier. n octets de S2. " Les matrices.equales () ne donne aucune indication dont elle est plus grande.



0
votes

3
votes

0 commentaires

1
votes

Eh bien, arranges.equaux () est bon, mais ne peut pas comparer les sous-angoisses. Dans ce cas, il y a aussi un chemin via arrayes.listof () et ultérieur .sublist () mais pas pour les primitives comme octet [] . < / p>

En réalité, il n'y a pas de MEMCMP (code> MEMCMP () équivalent. Voici Discussion et dès que je sais que c'est dans le même état maintenant (15 ans). La plupart des "indigènes" peuvent être réalisés par mon option via java.nio.bytebuffer ( wrap () méthode, puis égale () ). Mais c'est un peu important de code.

Pour les personnes qui ne comprennent pleinement pas le sujet: memcmp () est implémenté de manière dépendante de la plate-forme, qui est très efficace et que rien dans Java ne s'approche actuellement. Tous les cycles manuels sont bien éloignés en termes de performances au moins en raison de contrôles de plage d'index. Peut-être que des gens de jour originaires de C / C ++ seront satisfaits de ce sujet: -).


1 commentaires

plus 1 pour mentionner les sous-franges. Dans ce cas, on pourrait utiliser arrayes.copyofrange () avec des tableaux .equaux () mais probablement non efficace de toute façon.



6
votes

MEMCMP renvoie un int, inférieur à égal à ou supérieur à zéro si les n octets de S1 de S1 sont trouvés, respectivement, être inférieur à, ou être supérieur au premier N octets de S2. Equals renvoie un booléen. Ce n'est pas la même fonction. De plus, MEMCMP compare les octets comme des caractères non signés.

Je pense que cela pourrait fonctionner: xxx

(édition) En fait, la partie complémentaire de 2 n'est pas nécessaire: xxx


1 commentaires

Ne sont pas le retour 1 et le retour -1 inversé?



0
votes

en Java 8, et si vous corrigez bien les octets comme des valeurs non signées, ce que C / C ++ MemCMP fait réellement:

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


0 commentaires