结果不同,为什么?

时间:2017-02-14 11:08:38

标签: java arrays println

我有来自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

为什么?

提前感谢您的帮助!!

1 个答案:

答案 0 :(得分: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

请注意,第二个代码段仍缺少小数字的前导0。