不同的结果,为什么?
Different results, why?
我有来自 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 的打印 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。