2017-02-14 2 views
1

У меня есть код для печати MAC-адрес от Java, кодРазличные результаты, почему?

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

но имеет любопытство по этому поводу, и я пытаюсь сразу напечатать с

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

но это не Работа.

Результаты

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

почему?

Спасибо за помощь!

ответ

3

String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : "") производит 2 шестнадцатеричных цифры для каждого элемента массива.

С другой стороны, ваш код печатает десятичное представление каждого элемента, поэтому 27 (шестнадцатеричный) становится 39 (десятичный) и т. Д.

Если заменить

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

с

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

вы получите (почти) тот же результат.

Отметьте, что & 0xff требуется, чтобы получить положительное значение целого числа, 8 младших бит которого совпадают с исходным байтом. Без него байты с отрицательной оценкой (например, -106 в вашем примере) будут напечатаны как отрицательные числа.

Возьмем, например, 4-й байт, который ваш код печатает, как -106:

Во-первых, мы хотим, чтобы получить его значение без знака 150. Преобразование 150 из десятичной системы счисления в шестнадцатеричную дает 96.

После этого изменения выход 2 фрагментов является:

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

Обрати внимание, что второй фрагмент по-прежнему не хватает ведущие 0s для небольших чисел.

+0

Я не получаю двойной дефис между 39 и 106. Любая идея, что там происходит? – Holloway

+3

@Holloway Это потому, что OP печатает отрицательное значение байта «-106» – Eran

+1

Wooooww, отличное объяснение !!! Благодаря!!! – visent

Смежные вопросы