简体   繁体   English

使用getHardwareAddress非确定性获取Java中的mac地址

[英]Get mac address in Java using getHardwareAddress non-deterministic

I was having a problem to get the mac address of a machine, which was solved in this question using the follow code: 我在获取机器的mac地址时遇到了问题,使用以下代码解决了这个问题

Process p = Runtime.getRuntime().exec("getmac /fo csv /nh"); 
java.io.BufferedReader in = new java.io.BufferedReader(new  java.io.InputStreamReader(p.getInputStream())); 
String line; 
line = in.readLine();         
String[] result = line.split(","); 

System.out.println(result[0].replace('"', ' ').trim()); 

However, I would like to know why this code is not working. 但是,我想知道为什么这段代码不起作用。 Every time it reads the MAC address it returns a different value. 每次读取MAC地址时,它都会返回不同的值。 First I thought it was because getHash, maybe using a timestamp I dont know... But even removing it the result changes. 首先我认为这是因为getHash,可能使用我不知道的时间戳......但即使删除它,结果也会改变。

Code

    public static byte[] getMacAddress() {
        try {
            Enumeration<NetworkInterface> nwInterface = NetworkInterface.getNetworkInterfaces();
            while (nwInterface.hasMoreElements()) {
                NetworkInterface nis = nwInterface.nextElement();
                if (nis != null) {
                    byte[] mac = nis.getHardwareAddress();
                    if (mac != null) {
                        /*
                         * Extract each array of mac address and generate a
                         * hashCode for it
                         */
                        return mac;//.hashCode();
                    } else {
                        Logger.getLogger(Utils.class.getName()).log(Level.WARNING, "Address doesn't exist or is not accessible");
                    }
                } else {
                    Logger.getLogger(Utils.class.getName()).log(Level.WARNING, "Network Interface for the specified address is not found.");
                }
                return null;
            }
        } catch (SocketException ex) {
            Logger.getLogger(Utils.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }
}

Output example (i'm printing directly from byte array, but its enough to see that different i think) 输出示例(我直接从字节数组打印,但它足以看到我想的不同)

[B@91cee
[B@95c083
[B@99681b
[B@a61164
[B@af8358
[B@b61fd1
[B@bb7465
[B@bfc8e0
[B@c2ff5
[B@c8f6f8
[B@d251a3
[B@d6c16c
[B@e2dae9
[B@ef5502
[B@f7f540
[B@f99ff5
[B@fec107

Thanks in advance 提前致谢

B@91cee actually is the result toString() method of the byte[] arrays. B@91cee实际上是byte[]数组的toString()方法的结果。

I would suggest you print the value using new String(mac) instead. 我建议您使用new String(mac)来打印该值。

byte[].toString() is implemented as: byte[].toString()实现为:

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

Since default Object.hashCode() is implemented as address in memory, thus it is not consistent as you are creating new Object each time. 由于默认的Object.hashCode()是作为内存中的地址实现的,因此它不一致,因为每次都要创建新的Object

Edit: 编辑:

Since the returned byte is in hex, so you should convert it into decimal String. 由于返回的字节是十六进制的,因此您应该将其转换为十进制字符串。 The code can see from here 代码可以从这里看到

Here is an example from Mkyong.com web site on how to get the MAC address in Java: 以下是Mkyong.com网站上有关如何使用Java获取MAC地址的示例:

package com.mkyong;

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;

public class app{

   public static void main(String[] args){

    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();

    }

   }

}

The answer from spaniard doesn't work if the machine is not connected and it will give different values depend on network you are connected to. 如果机器未连接,则西班牙人的答案不起作用,它将根据您连接的网络给出不同的值。

this one is not depending on any ip adress : 这个不依赖于任何ip地址:

public class MacAdress {
    public static void main(String[] args) {
        try {
            InetAddress ip = InetAddress.getLocalHost();
            System.out.println("Current IP address : " + ip.getHostAddress());

            Enumeration<NetworkInterface> networks =
                             NetworkInterface.getNetworkInterfaces();
            while(networks.hasMoreElements()) {
                NetworkInterface network = networks.nextElement();
                byte[] mac = network.getHardwareAddress();

                if (mac != null) {
                    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) ? "-" : ""));
                    }
                }
            }
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (SocketException e){
            e.printStackTrace();
        }
    }
}
public static String getHardwareAddress() throws Exception {
    InetAddress ip = InetAddress.getLocalHost();
    NetworkInterface ni = NetworkInterface.getByInetAddress(ip);
    if (!ni.isVirtual() && !ni.isLoopback() && !ni.isPointToPoint() && ni.isUp()) {
        final byte[] bb = ni.getHardwareAddress();
        return IntStream.generate(ByteBuffer.wrap(bb)::get).limit(bb.length)
                .mapToObj(b -> String.format("%02X", (byte)b))
                .collect(Collectors.joining("-"));
    }
    return null;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM