J'utilise ce code pour trouver l'adresse MAC d'une machine. Ce code imprime directement l'adresse MAC, mais je veux le retourner comme une chaîne. Je suis complètement confus.
aide s'il vous plaît. P>
8 Réponses :
Peut-être que vous pourriez peut-être utiliser Heex.encodehex (octets) code>
du codec commun. P>
Voici Autres façons de le faire, sans bibliothèques 3ème partie. p>
Il n'y a pas de représentation de texte standard pour les adresses MAC. Il vous suffit de le convertir en hexagone et de séparer les octets pour la lisibilité. Voici la fonction que j'utilise dans le format IFCONFIG sur UNIX,
public static String getMacAddress(String ipAddr) throws UnknownHostException, SocketException { InetAddress addr = InetAddress.getByName(ipAddr); NetworkInterface ni = NetworkInterface.getByInetAddress(addr); if (ni == null) return null; byte[] mac = ni.getHardwareAddress(); if (mac == null) return null; StringBuilder sb = new StringBuilder(18); for (byte b : mac) { if (sb.length() > 0) sb.append(':'); sb.append(String.format("%02x", b)); } return sb.toString(); }
Cela a l'air gentil avec moi. Il est également possible d'éviter la chaîne.format () si la performance est une préoccupation car elle est une fonction notoirement lente.
Ça me donne NullPointerException en ligne NetworkInterface NI = NetworkInterface.getByIneTAddress (Addr); Code> Mais mon objet inétaddress contient une adresse iPaddressable valide ... Toute aide est appréciée ....
@Chris il est improbable quelques appels à String.Format sera le goulot d'étranglement dans une application
private static final byte[] NULL_MAC = new byte[] {0, 0, 0, 0, 0, 0}; public static String getMacString(byte[] macAddress) { StringBuilder retval = new StringBuilder(17); if (macAddress == null) { macAddress = NULL_MAC; } boolean isFirst = true; for (byte b : macAddress) { if (!isFirst) { retval.append(":"); } else { isFirst = false; } retval.append(String.format("%02x", b & 0xff)); } return retval.toString(); }
Cela devrait être quelque chose comme
String s=""; for (int i = 0; i < mac.length; i++) { s += String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : ""); }
Les chaînes de concaténation avec + = sont extrêmement inefficaces (utilisez un StressBuilder plutôt que dans les autres réponses). De plus, il semble que vous ayez une trop grande quantité de code sur une seule ligne qui n'aide ni empêche la performance, mais produise du code illisible lorsqu'il est augmenté jusqu'à plusieurs milliers de lignes.
Par ceci, vous pouvez facilement former une chaîne d'adresse MAC. Copier à partir d'ici: http://www.mkyong.com/java/how-to-get-mac-address-in-in- Java / Commentaire-Page-1 / # Commentaire-139182 P> P>
Je sais que c'est une question liée à Java, mais pour les utilisateurs Scala qui ont fini ici comme si je l'ai fait, c'est un moyen de le faire à Scala:
bytes.map("%02X" format _).mkString (":")
Pour quelque chose de léger et rapide, essayez ce qui suit. Les dépendances externes 3ème partie sont minimes et utilisent simplement une "vieille école" mathématique.
public static String buildMACAddressString(byte[] macaddress) { char[] buffer = new char[macaddress.length*3]; char[] inttohex= {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; int destIndex=0; byte byteValue; for (int i = 0; i < macaddress.length; i++) { // pull current byte value byteValue = (byte) (macaddress[i] & 0xff); // convert high nibble to hex char and store into char array.. buffer[destIndex++]=inttohex[(byteValue&0xf0)>>4]; // Convert low nibble to hex char and store into char array.. buffer[destIndex++]=inttohex[byteValue&0xf]; // Inject spacer if (i < macaddress.length-1) buffer[destIndex++]=':'; } return String.valueOf(buffer,0,destIndex); }
Si vous devez retourner une chaîne formatée de la même manière, utilisez un StringBuilder et appendez-le dans une boucle formatée avec String.Format (..).
Voir Stackoverflow.com/Questtions/311165/...