2017-02-14 16 views
1

나는 자바에서 인쇄 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 개 조각의 출력은 다음과 같습니다 두 번째 조각은 여전히 ​​소수의 선도 0 부족한 것을

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

참고.

+0

39와 106 사이에 이중 하이픈이 표시되지 않습니다. 무슨 일이 벌어지는 지 알아? – Holloway

+3

@Holloway OP가 음수 바이트 값 "-106"을 출력하기 때문입니다 – Eran

+1

Wooooww, 큰 설명 !!! 감사!!! – visent