2017-02-14 13 views
1

私はJavaからの印刷MACアドレスのコードを持って、コードが結果が異なるのはなぜですか?

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桁の16進数を生成します。

一方、コードでは各要素の10進表現が表示されるため、27(16進数)は39(10進数)になります。

あなたは

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

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

を交換する場合は、(ほぼ)同じ結果を得るでしょう。

& 0xffは、8つの最下位ビットが元のバイトと同じである整数の正の値を取得するために必要です。それがなければ負の値のバイト(あなたの例では-106)は負の数として表示されます。私たちは10進数から16進数150を変換し、その符号なしの値150を取得したい

まずその変更後96

を与える:

例えば、-106として4バイト、あなたのコードのプリントを取ります2つのスニペットの出力は次のようになります。

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

2番目のスニペットには、小さい数字の先頭に0が残りません。

+0

私は39と106の間に二重ハイフンを取得しません。何が起こっているのだろうか? – Holloway

+3

@Hollowayこれは、OPが負のバイト値 "-106"を印刷しているからです。 – Eran

+1

Wooooww、素晴らしい説明!!!ありがとうございました! – visent