2013-07-29 38 views
6

Tôi có địa chỉ MAC được lưu trữ dưới dạng số nguyên 48 bit và tôi muốn chia nhỏ nó ra và in theo định dạng hex chuẩn xx: xx: xx: xx: xx: xx. Ví dụ: số nguyên 81952921372024 sẽ trở thành 78: 45: c4: 26: 89: 4a. Nỗ lực đầu tiên của tôi là,Chuyển đổi địa chỉ MAC nguyên thành chuỗi trong 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)); 

Nhưng vì Javascript dường như không thể xử lý> số nguyên 32 bit khi thực hiện thao tác chuyển đổi, còn hai octet cuối luôn đi ra để 0,

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

'2333752735057272..toString (16)' cung cấp '84a8926c44578' cho tôi trong Chrome. Điều gì sẽ xảy ra nếu bạn lấy nó, cắt chữ số đầu tiên và đảo ngược các octet? – bfavaretto

+0

Bạn chắc chắn rằng địa chỉ MAC là đúng? Nó trông ngoài tầm với tôi. – user2357112

+2

Thật vậy, JavaScript không có khái niệm> số nguyên 32 bit hoặc thậm chí là số nguyên 32 bit; nó chỉ có một kiểu 'số', có nghĩa là các giá trị dấu phẩy động (64-bit), và các phép toán số nguyên-y khác nhau, chẳng hạn như thay đổi bit, thực hiện chuyển đổi ngầm đến và từ các số nguyên 32 bit. – ruakh

Trả lời

10

Một cách tiếp cận đơn giản trông như sau:

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" 

Tuy nhiên tôi đề nghị đưa thêm 00 nhóm chỉ cho các trường hợp bệnh lý khi số nguyên của bạn rất ngắn (tức là 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

Tại sao tạo một mảng chứa đầy '0'? Sẽ không trực tiếp sử dụng mảng được tạo bởi 'match' trên phiên bản đã được xâu chuỗi của' mac' ('mac.toString (16) .match (/../ g) .reverse(). Join (':')') được dễ dàng hơn, thay vì ghép nó vào mảng dài hơn và phải làm một chuỗi con? – ajp15243

+0

@ ajp15243 Cập nhật câu trả lời với giải thích. – oleq

+0

Thật không may điều này đã không làm việc cho tôi. Mac 1025 (00: 00: 00: 00: 04: 01) đã được chuyển thành 1: 40: 00: 00: 00: 00, rõ ràng là không chính xác. – Dominik

1

Sau đây hiện công việc,

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:

để chăm sóc trailing 0 của

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

+0

Không hoạt động nếu các octet bằng 0 ở đầu. Ví dụ: hexValue = 3, nó không bao giờ lặp lại và điền vào mảng macaddress. – PherricOxide

+0

@PherricOxide thực hiện điều này có đúng không? Một cú đánh nhanh vào nó. – v2b

+0

Điều này làm việc cho tôi. – Dominik

Các vấn đề liên quan