2013-07-29 18 views
6

Mam adres MAC zapisany jako nieprzetworzony 48-bitowy numer i chcę go podzielić i wydrukować w standardowym formacie szesnastkowym xx: xx: xx: xx: xx: xx. Na przykład liczba nieprzetworzona 81952921372024 powinna wynieść 78: 45: c4: 26: 89: 4a. Moja pierwsza próba byłaKonwertuj całkowity adres MAC na ciąg w 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)); 

Ale ponieważ Javascript najwyraźniej nie może obsługiwać 32-bitowe liczby całkowite> podczas wykonywania pracy zmianowej, ostatnie dwa oktety zawsze wyjdzie na 0,

78:45:c4:26:0:0 
+2

'2333752735057272..toString (16)' '84a8926c44578' daje mi w Chrome. Co jeśli to zrobisz, wykadruj pierwszą cyfrę i odwróć oktety? – bfavaretto

+0

Jesteś pewien, że adres MAC jest właściwy? Wygląda na to, że jest poza zasięgiem. – user2357112

+2

Rzeczywiście, JavaScript nie ma pojęcia> 32-bitowych liczb całkowitych, a nawet naprawdę 32-bitowych liczb całkowitych; ma po prostu typ 'number', co oznacza podwójną precyzję (64-bitowe) wartości zmiennoprzecinkowe, a różne operacje typu integer-y, takie jak przesunięcia bitowe, wykonują niejawną konwersję do 32-bitowych liczb całkowitych. – ruakh

Odpowiedz

10

Proste podejście wygląda następująco:

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" 

Jednak proponuję wprowadzenie dodatkowych 00 grupy tylko dla przypadków patologicznych, gdy twoja liczba całkowita jest bardzo krótka (tj 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

Dlaczego tablica jest wypełniona '0'? Nie używałaby bezpośrednio tablicy utworzonej przez 'match' na usztywnionej wersji' mac' ('mac.toString (16) .match (/../ g) .reverse(). Join (':')') być łatwiejsze niż łączenie go z dłuższą tablicą i wykonywanie podciągu? – ajp15243

+0

@ ajp15243 Zaktualizowano odpowiedź z wyjaśnieniem. – oleq

+0

Niestety to nie działa dla mnie. Mac 1025 (00: 00: 00: 00: 04: 01) został zmieniony na 1: 40: 00: 00: 00: 00, co oczywiście nie jest poprawne. – Dominik

1

Poniższy robi praca,

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

wyjściowa:
28:cf:e9:1e:c6:05

EDIT:

dbać o spływu 0 na

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

wyjściowa:
00:45:d9:64:b8:00

+0

Nie działa, jeśli oktety są zerowe na końcach. Na przykład wartość hexValue = 3, nie zapętla się i nie wypełnia tablicy macaddress. – PherricOxide

+0

@PherricOxide robi to dobrze? Szybki strzał. – v2b

+0

Ten pracował dla mnie. – Dominik