8

I was having a problem to get the mac address of a machine, which was solved in this question using the follow code:

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. First I thought it was because getHash, maybe using a timestamp I dont know... But even removing it the result changes.

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

Community
  • 1
  • 1
Pedro Dusso
  • 2,100
  • 9
  • 34
  • 64

4 Answers4

10

B@91cee actually is the result toString() method of the byte[] arrays.

I would suggest you print the value using new String(mac) instead.

byte[].toString() is implemented as:

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.

Edit:

Since the returned byte is in hex, so you should convert it into decimal String. The code can see from here

Community
  • 1
  • 1
Pau Kiat Wee
  • 9,485
  • 42
  • 40
7

Here is an example from Mkyong.com web site on how to get the MAC address in Java:

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

    }

   }

}
Eduardo Sanchez-Ros
  • 1,777
  • 2
  • 18
  • 30
4

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 :

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();
        }
    }
}
Nick Meyer
  • 1,771
  • 1
  • 17
  • 29
amghar
  • 41
  • 3
2
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;
}
s13o
  • 116
  • 1
  • 5