Convert integer MAC address to string in Javascript
The accepted answer did not pass my unit tests (convert mac address to a number then convert back and expect the result equals the input).
As @blueren said the accepted answer returns a reversed result.
My version is:
(mac_num).toString(16).padStart(12, '0').match(/../g)
.reverse()
.slice(0, 6)
.reverse()
.join(':')
My tests:
expect(mac.toString(mac.toLong('b4:ae:2b:db:1c:3d'))).to.deep.equal('b4:ae:2b:db:1c:3d');
expect(mac.toString(mac.toLong('00:00:00:db:1c:3d'))).to.deep.equal('00:00:00:db:1c:3d');
expect(mac.toString(mac.toLong('b4:ae:2b:00:00:00'))).to.deep.equal('b4:ae:2b:00:00:00');
expect(mac.toString(mac.toLong('00:00:00:00:00:00'))).to.deep.equal('00:00:00:00:00:00');
expect(mac.toString(mac.toLong('10:00:00:00:00:00'))).to.deep.equal('10:00:00:00:00:00');
expect(mac.toString(mac.toLong('00:00:01:00:00:00'))).to.deep.equal('00:00:01:00:00:00');
expect(mac.toString(mac.toLong('00:00:00:00:00:01'))).to.deep.equal('00:00:00:00:00:01');
The following does the job,
var hexValue = parseInt('44873434449413').toString(16);
var macaddress = [];
for (var i=0; i < hexValue.length; i=i+2) {
macaddress.push(hexValue.substr(i,2));
}
console.log(macaddress.join(':'));
Output:28:cf:e9:1e:c6:05
EDIT:
to take care of trailing 0's
str='3';
if (str.length < 12) { str = pad_after(str, 12, 0);}
var hexValue = parseInt(str).toString(16);
if (hexValue.length < 12) { hexValue = pad_before(hexValue, 12, 0);}
var macaddress = [];
for (var i=0; i < hexValue.length; i=i+2) {
macaddress.push(hexValue.substr(i,2));
}
console.log(macaddress.join(':'));
function pad_before(n, width, z) {
z = z || '0';
n = n + '';
return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;
}
function pad_after(n, width, z) {
z = z || '0';
n = n + '';
return n.length >= width ? n : n + new Array(width - n.length + 1).join(z);
}
Output:00:45:d9:64:b8:00
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"