Search code examples
javascriptmac-address

Convert integer MAC address to string in Javascript


I have a MAC address stored as a raw 48 bit number, and I want to split it up and print it in the standard hex format of xx:xx:xx:xx:xx:xx. For example, the raw number 81952921372024 should become 78:45:c4:26:89:4a. My first attempt was,

var suspect = {mac: 2333752735057272};
console.log(
    Number(suspect.mac & 0xFF).toString(16) + ":" +
    Number((suspect.mac & 0xFF00) >> 8).toString(16) + ":" +
    Number((suspect.mac & 0xFF0000) >> 16).toString(16) + ":" +
    Number((suspect.mac & 0xFF000000) >> 24).toString(16) + ":" +
    Number((suspect.mac & 0xFF00000000) >> 32).toString(16) + ":" +
    Number((suspect.mac & 0xFF0000000000) >> 48).toString(16));

But because Javascript apparently can't handle > 32 bit integers when doing shift operations, the last two octets always come out to 0,

78:45:c4:26:0:0 

Solution

  • A simple approach looks as follows:

    var mac = 81952921372024;
    
    mac.toString( 16 )             // "4a8926c44578"
            .match( /.{1,2}/g )    // ["4a", "89", "26", "c4", "45", "78"]
            .reverse()             // ["78", "45", "c4", "26", "89", "4a"]
            .join( ':' )           // "78:45:c4:26:89:4a"
    
    > "78:45:c4:26:89:4a"
    

    However I suggest putting additional 00 groups just for pathological cases when your integer is very short (i.e. mac = 150):

    var mac = 81952921372024;
    
    new Array( 6 ).join( '00' )    // '000000000000'
        .match( /../g )            // [ '00', '00', '00', '00', '00', '00' ]
        .concat( 
            mac.toString( 16 )     // "4a8926c44578"
               .match( /.{1,2}/g ) // ["4a", "89", "26", "c4", "45", "78"]
        )                          // ["00", "00", "00", "00", "00", "00", "4a", "89", "26", "c4", "45", "78"]
        .reverse()                 // ["78", "45", "c4", "26", "89", "4a", "00", "00", "00", "00", "00", "00", ]
        .slice( 0, 6 )             // ["78", "45", "c4", "26", "89", "4a" ]
        .join( ':' )               // "78:45:c4:26:89:4a"
    
    > "78:45:c4:26:89:4a"