2013-07-29 2 views
6

У меня есть MAC-адрес, который хранится как необработанное 48-битное число, и я хочу разбить его и напечатать в стандартном шестнадцатеричном формате xx: xx: xx: xx: xx: хх. Например, необработанный номер 81952921372024 должен стать 78: 45: c4: 26: 89: 4a. Моя первая попытка была,Преобразование целочисленного MAC-адреса в строку в Javascript

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 
+2

'2333752735057272..toString (16)' 'дает 84a8926c44578' мне в Chrome. Что, если вы возьмете это, обрезаете первую цифру и отмените октеты? – bfavaretto

+0

Вы уверены, что MAC-адрес правильный? Он выглядит вне пределов до меня. – user2357112

+2

Действительно, JavaScript не имеет понятия о 32-битных целых числах или даже о 32-битных целых числах; он просто имеет тип «номер», означающий значения с плавающей запятой с двойной точностью (64-разрядные), а различные операции целочисленного типа, такие как сдвиги бит, выполняют неявное преобразование в 32-битные целые числа и из них. – ruakh

ответ

10

Простой подход выглядит следующим образом:

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" 

Однако я предлагаю положить дополнительные 00 группы просто для патологических случаев, когда ваше целое очень короткое (т.е. 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" 
+0

Зачем массива заполнять '0'? Не использовал бы напрямую массив, созданный 'match' в строковой версии' mac' ('mac.toString (16) .match (/../g) .reverse(). Join (':')') быть проще, а не конкатенировать его на более длинном массиве и делать подстроку? – ajp15243

+0

@ ajp15243 Обновлен ответ с объяснением. – oleq

+0

К сожалению, это не сработало для меня. Mac 1025 (00: 00: 00: 00: 04: 01) превратили в 1: 40: 00: 00: 00: 00, что, очевидно, неверно. – Dominik

1

Следующая делает работа,

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

EDIT:

заботиться завершающих 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

+0

Не работает, если октеты на концах равны нулю. Например, hexValue = 3, он никогда не зацикливается и не заполняет массив macaddress. – PherricOxide

+0

@PherricOxide делает это правильно? Быстрый выстрел в него. – v2b

+0

Это работало для меня. – Dominik

 Смежные вопросы

  • Нет связанных вопросов^_^