1

次のプログラムは、ノードのMACアドレスを出力するためのものです。しかし、それは空白を印刷します。nullをチェックしましたが、nullではありません。なぜ空白の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はfalseです。

4

5 に答える 5

4

このディスカッションによると、「まあ、「localhost」に反応するインターフェイスは通常、MAC アドレスを持たないループバック デバイスなので、それが原因かもしれません。」

于 2012-12-11T09:24:16.900 に答える
2

localhostMAC アドレスを持つループバック インターフェイスを見たことがありません。あまり役に立たないと思います。

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

版画

[]

これは唯一の仮想ソフトウェア デバイスであるため、驚くことではありません。

于 2012-12-11T09:01:59.923 に答える
1

InetAddress.getLocalHost();の代わりにlocalhost を取得する必要が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 アドレスを読み取り可能な 16 進数形式に変換することが重要であることを忘れないでください。そのため、以下のコード ブロックを記述しました。そうしないと、ガベージ テキストを として受け取ります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

Java 7のJavaDocsを確認すると、getLocalhost()おそらく必要なものがあることがわかります。

于 2012-12-11T09:13:12.927 に答える
0

MAC アドレスはバイトの配列で、最初のバイトはゼロの場合があります。

印刷するには、 Bhavik Ambani's answerに示されているように String.format を使用するなど、印刷可能な英数字 (16 進数など) 形式に変換する必要があります。

于 2012-12-11T09:24:45.403 に答える