2017-02-14 2 views
1

I-Code für den Druck MAC-Adresse von Java habe, ist der CodeVerschiedene Ergebnisse, warum?

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

aber ich habe Neugier darüber, und ich versuche, direkt mit

System.out.print("Current MAC address : "); 
for (int i = 0; i < mac.length; i++) { 
     System.out.print(mac[i]); 
       if (i < mac.length - 1) 
        System.out.print("-"); 
       else 
        System.out.print(""); 
} 

aber es nicht drucken Arbeit.

Die Ergebnisse sind

Current MAC address : 08-00-27-96-40-39 
Current MAC address : 8-0-39--106-64-57 

warum?

Vielen Dank im Voraus für Ihre Hilfe !!

Antwort

3

String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : "") erzeugt 2 hexadezimale Ziffern für jedes Element des Arrays.

Auf der anderen Seite druckt Ihr Code die dezimale Darstellung jedes Elements, so 27 (hex) wird 39 (dezimal), und so weiter.

Wenn Sie

System.out.print(mac[i]); 

mit

System.out.print(Integer.toString (mac[i] & 0xff,16).toUpperCase()); 

ersetzen werden Sie (fast) das gleiche Ergebnis.

Beachten Sie, dass & 0xff erforderlich ist, um den positiven Wert der Ganzzahl zu erhalten, deren 8 niedrigste Bits identisch mit dem ursprünglichen Byte sind. Ohne es werden die negativ bewerteten Bytes (wie -106 in Ihrem Beispiel) als negative Zahlen gedruckt.

Nehmen wir zum Beispiel das 4. Byte, die Ihr Code druckt als -106:

Zuerst wollen wir seinen Wert ohne Vorzeichen 150. 150 bis hexadezimal aus Dezimalzahl ergibt 96.

Nach dieser Änderung Konvertieren erhalten die Ausgabe der 2-Schnipsel ist:

Current MAC address : 08-00-27-96-40-39 
Current MAC address : 8-0-27-96-40-39 

Beachten Sie, dass das zweite Schnipsel noch die führenden 0s für kleine Zahlen fehlt.

+0

Ich bekomme nicht den doppelten Bindestrich zwischen 39 und 106 obwohl. Irgendeine Idee, was dort vor sich geht? – Holloway

+3

@Holloway Das ist, weil das OP einen negativen Bytewert "-106" druckt – Eran

+1

Wooooww, eine großartige Erklärung !!! Vielen Dank!!! – visent

Verwandte Themen