【问题标题】:Why do I get a blank MAC address?为什么我得到一个空白的 MAC 地址?
【发布时间】:2012-12-11 08:59:42
【问题描述】:

以下程序用于打印我的节点的 MAC 地址。但它打印一个空白。我检查了它是否为空,但它不是空的。为什么我会得到一个空白的 MAC 地址?我犯了什么错误?

import java.net.InetAddress;
import java.net.NetworkInterface;

class Tester {
public static void main(String args[]) {
    try {
      InetAddress address = InetAddress.getByName("localhost");
      NetworkInterface ni = NetworkInterface.getByInetAddress(address);
      byte mac[] = ni.getHardwareAddress();
      if(mac == null) {
        System.out.println("Mac address is null");
      } else {
        System.out.println("Else block!");
        String macAdd = new String(mac);
        System.out.println(macAdd);
      }

    } catch(Exception exc) {
       exc.printStackTrace();
    }
}
}

注意: mac == null 是假的。

【问题讨论】:

    标签: java networking mac-address


    【解决方案1】:

    根据this discussion“嗯,对“localhost”做出反应的接口通常是环回设备,它没有 MAC 地址,所以这可能是你的原因。”

    【讨论】:

      【解决方案2】:

      我从未见过带有 MAC 地址的localhost 环回接口。我怀疑它不是很有用。

      System.out.println(Arrays.toString(mac));
      

      打印

      []
      

      这并不奇怪,因为它只是一个虚拟软件设备。

      【讨论】:

      • 如果我将 localhost 替换为我的网络 IP 192.168.43.187 我会看到:p±íí▀⌡ 这是什么?
      • 它是你的mac地址变成了字符。如果您知道这些字符的 ascii 代码,您可以计算出 mac 地址,或者如果您想查看数字,您可以按照我建议的方式打印它。 ;)
      【解决方案3】:

      你应该通过InetAddress.getLocalHost();而不是InetAddress.getByName("localhost");获取本地主机。请参考我下面的例子来解决你的问题。

      import java.net.InetAddress;
      import java.net.NetworkInterface;
      
      public class Tester {
          public static void main(String args[]) {
              try {
                  InetAddress address = InetAddress.getLocalHost();
                  NetworkInterface ni = NetworkInterface.getByInetAddress(address);
                  byte mac[] = ni.getHardwareAddress();
                  if (mac == null) {
                      System.out.println("Mac address is null");
                  } else {
                      System.out.println("Else block!");
                      StringBuilder sb = new StringBuilder();
                      for (int i = 0; i < mac.length; i++) {
                          sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : ""));        
                      }
                      String macAdd = new String(sb);
                      System.out.println(macAdd);
                  }
      
              } catch (Exception exc) {
                  exc.printStackTrace();
              }
          }
      }
      

      输出

      Else block!
      44-87-FC-F1-D4-77
      

      注意:-

      记住将收到的mac地址转换成可读的十六进制格式很重要,所以我写了下面的代码块。如果您不这样做,那么您将收到垃圾短信D‡üñÔw

                  StringBuilder sb = new StringBuilder();
                  for (int i = 0; i < mac.length; i++) {
                      sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : ""));        
                  }
                  String macAdd = new String(sb);
      

      【讨论】:

      • 你能解释一下步骤吗String.format("%02X%s", mac[i], (i &lt; mac.length - 1) ? "-" : "")
      • 这被调用来将你收到的 MAC 地址格式化为可读的 HEX 格式,如果你不这样做,那么你的输出将是 D‡üñÔw 这样的。
      【解决方案4】:

      如果您检查 Java 7 的 JavaDocs,您会注意到 getLocalhost() 可能是您想要的。

      【讨论】:

        【解决方案5】:

        MAC 地址是一个字节数组,第一个字节可能为零。

        要打印它,您需要将其转换为可打印的字母数字(例如十六进制)格式,例如使用 Bhavik Ambani's answer 中所示的 String.format。

        【讨论】: