2010-05-09 3 views
7

Я использую этот код, чтобы найти MAC-адрес машины. Этот код печатает непосредственно MAC-адрес, но я хочу вернуть его как строку. Я совершенно смущен.Форматирование массива байтов MAC-адресов для строки

помогите пожалуйста.

try { 

    InetAddress add = InetAddress.getByName("10.123.96.102"); 
    NetworkInterface ni1 = NetworkInterface.getByInetAddress(add); 
    if (ni1 != null) { 
     byte[] mac1 = ni1.getHardwareAddress(); 
     if (mac1 != null) { 
      for (int k = 0; k < mac1.length; k++) { 
       System.out.format("%02X%s", mac1[k], (k < mac1.length - 1) ? "-" : ""); 
      } 
     } else { 
      System.out.println("Address doesn't exist "); 
     } 
     System.out.println(); 
    } else { 
     System.out.println("address is not found."); 
    } 
} catch (UnknownHostException e) { 
    e.printStackTrace(); 
} catch (SocketException e) { 
    e.printStackTrace(); 
} 
+1

Если вам нужно вернуть строку, отформатированную таким же образом, используйте StringBuilder и добавьте ее в части цикла, форматированные с помощью String.format (..). –

+0

См. Http://stackoverflow.com/questions/311165/how-do-you-convert-byte-array-to-hexadecimal-string-and-vice-versa-in-c/632920#632920 – Zaki

ответ

18

Нет стандартного текстового представления для адресов Mac. Вам просто нужно преобразовать его в шестнадцатеричный и отделить байты для удобочитаемости. Вот функция, я использую в формате IFCONFIG на 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(); 
} 

Вам просто нужно изменить «:» на «-».

+0

Это выглядит красиво меня. Также можно избежать String.format(), если производительность является проблемой, так как это известная медленная функция. – Chris

+0

Это дает мне NullPointerException в строке 'NetworkInterface ni = NetworkInterface.getByInetAddress (addr);' но мой объект InetAddress содержит действительный IPAddress ... любая помощь приветствуется .... – Durrat

2

Возможно, вы можете использовать Hex.encodeHex(bytes) из общедоступного кодека.

Here are другие способы сделать это, без сторонних библиотек.

0
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(); 
    } 
1

Это должно быть что-то вроде

StringBuilder sb = new StringBuilder(); 
for (int i = 0; i < mac.length(); i++) { 
    b.append(String.format("%02X%s", mac[i], (i < mac.length() - 1) ? "-" : ""); 

String s = sb.toString(); 
-1
String s=""; 
for (int i = 0; i < mac.length; i++) { 
    s += String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : ""); 
} 
+1

Объединение строк с + = крайне неэффективно (используйте StringBuilder вместо этого, как и в других ответах). Кроме того, похоже, что вы добавили слишком много кода в одну строку, которая не помогает и не препятствует производительности, но создает нечитаемый код при масштабировании до многих тысяч строк. – Chris

4

Благодаря этому вы можете легко формиата Mac Address String.

import java.net.InetAddress; 
import java.net.NetworkInterface; 
import java.net.SocketException; 
import java.net.UnknownHostException; 

public class App{ 

    public static void main(String[] args){ 

    InetAddress ip; 
    try { 

     ip = InetAddress.getLocalHost(); 
     System.out.println("Current IP address : " + ip.getHostAddress()); 

     NetworkInterface network = NetworkInterface.getByInetAddress(ip); 

     byte[] mac = network.getHardwareAddress(); 

     System.out.print("Current MAC address : "); 

     StringBuilder sb = new StringBuilder(); 
     for (int i = 0; i < mac.length; i++) { 
      sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : ""));   
     } 
     System.out.println(sb.toString()); 

    } catch (UnknownHostException e) { 

     e.printStackTrace(); 

    } catch (SocketException e){ 

     e.printStackTrace(); 

    } 

    } 

} 

копия здесь: http://www.mkyong.com/java/how-to-get-mac-address-in-java/comment-page-1/#comment-139182

0

Я знаю, что это родственный Java вопрос, но для пользователей Scala, которые оказались здесь, как я сделал, это способ сделать это в Scala:

bytes.map("%02X" format _).mkString (":")