簡體   English   中英

在Javascript中將整數MAC地址轉換為字符串

[英]Convert integer MAC address to string in Javascript

我有一個存儲為原始 48 位數字的 MAC 地址,我想將其拆分並以 xx:xx:xx:xx:xx:xx 的標准十六進制格式打印。 例如,原始數字 81952921372024 應該變成 78:45:c4:26:89:4a。 我的第一次嘗試是,

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

但是因為 Javascript 在進行移位操作時顯然無法處理 > 32 位整數,所以最后兩個八位字節總是為 0,

78:45:c4:26:0:0 

一個簡單的方法如下所示:

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"

但是,當您的整數非常短(即mac = 150 )時,我建議僅針對病理情況放置額外的00組:

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"

以下工作,

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

輸出:
28:cf:e9:1e:c6:05

編輯:

處理尾隨 0

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

輸出:
00:45:d9:64:b8:00

接受的答案沒有通過我的單元測試(將 mac 地址轉換為數字然后轉換回來並期望結果等於輸入)。

正如@blueren所說,接受的答案返回相反的結果。

我的版本是:

(mac_num).toString(16).padStart(12, '0').match(/../g)
                .reverse()
                .slice(0, 6)
                .reverse()
                .join(':')

我的測試:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM