2010-05-09 37 views
7

Tôi đang sử dụng mã này để tìm địa chỉ MAC của máy. Mã này in trực tiếp địa chỉ MAC, nhưng tôi muốn trả về nó như một chuỗi. Tôi hoàn toàn bối rối.Định dạng mảng byte địa chỉ MAC thành chuỗi

vui lòng trợ giúp.

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

Nếu bạn cần trả về một chuỗi được định dạng theo cùng một cách, hãy sử dụng một StringBuilder và nối thêm nó vào một phần vòng lặp được định dạng bằng String.format (..). –

+0

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

Trả lời

18

Không có đại diện văn bản chuẩn cho địa chỉ Mac. Bạn chỉ cần chuyển đổi nó thành hex và tách các byte để dễ đọc. Đây là hàm tôi sử dụng ở định dạng ifconfig trên 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(); 
} 

Bạn chỉ cần thay đổi ':' thành '-'.

+0

Điều này có vẻ thú vị tôi. Cũng có thể tránh được String.format() nếu hiệu suất là một mối quan tâm vì nó là một hàm chậm nổi tiếng. – Chris

+0

Nó cho tôi NullPointerException tại dòng 'NetworkInterface ni = NetworkInterface.getByInetAddress (addr);' nhưng đối tượng InetAddress của tôi chứa IPAddress hợp lệ ... bất kỳ trợ giúp nào được đánh giá cao .... – Durrat

2

Có lẽ bạn có thể sử dụng Hex.encodeHex(bytes) từ commons-codec.

Here are các cách khác để thực hiện việc này, không có thư viện của bên thứ ba.

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

Nó phải là một cái gì đó giống như

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

Ghép nối chuỗi với + = cực kỳ không hiệu quả (sử dụng StringBuilder thay vào đó là trong các câu trả lời khác). Ngoài ra, có vẻ như bạn đã đóng gói quá nhiều mã vào một dòng đơn không giúp cũng không cản trở hiệu suất nhưng không tạo ra mã không đọc được khi được tăng tỷ lệ lên tới hàng nghìn dòng. – Chris

4

Bằng cách này, bạn có thể dễ dàng formate 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(); 

    } 

    } 

} 

bản sao từ đây: http://www.mkyong.com/java/how-to-get-mac-address-in-java/comment-page-1/#comment-139182

0

Tôi biết đây là một câu hỏi liên quan đến Java, nhưng đối với người dùng Scala người đã kết thúc ở đây như tôi đã làm, đây là một cách để làm điều đó trong Scala:

bytes.map("%02X" format _).mkString (":") 
Các vấn đề liên quan