1

以下程序旨在打印我的节点的 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为假。

4

5 回答 5

4

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

于 2012-12-11T09:24:16.900 回答
2

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

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

印刷

[]

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

于 2012-12-11T09:01:59.923 回答
1

你应该得到 localhostInetAddress.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);
于 2012-12-11T09:17:30.357 回答
0

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

于 2012-12-11T09:13:12.927 回答
0

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

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

于 2012-12-11T09:24:45.403 回答