java - 不同的结果,为什么?

标签 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

为什么?

提前感谢您的帮助!!

最佳答案

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。

关于java - 不同的结果,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42224588/

相关文章:

c - 向矩阵添加额外的列

c - C中指向结构和数组的指针

rust - 将 println 设为宏有什么好处?

java - Gradle & Groovy - 错误 : Could not find or load main class

java - jsf提交动态生成的表,其中包含多个<h :inputtext>

Java 文件错误,因为\

java - Play Framework : Rendering PDF using PDF module makes call to generate dynamic images 3 times each

c - 从文件读入二维字符数组

java - 我们可以在不使用 main 方法、静态变量和静态方法的情况下在控制台上打印 java 消息吗?

java - 我想打印一个图表,但我把它打印颠倒了。为什么?