2012-04-15 174 views
2

我正在尋找一種方法在C#中生成一個隨機的MAC號碼。 Google在這方面相當薄弱。生成一個隨機的mac地址

THX很多

SOLUTION:

隨着葉海亞的幫助,我編寫了以下解決方案。 Thx再次!

public static string GenerateMACAddress() 
    { 
     var sBuilder = new StringBuilder(); 
     var r = new Random(); 
     int number; 
     byte b; 
     for (int i = 0; i < 6; i++) 
     { 
      number = r.Next(0, 255); 
      b = Convert.ToByte(number); 
      if (i == 0) 
      { 
       b = setBit(b, 6); //--> set locally administered 
       b = unsetBit(b, 7); // --> set unicast 
      } 
      sBuilder.Append(number.ToString("X2")); 
     } 
     return sBuilder.ToString().ToUpper(); 
    } 

    private static byte setBit(byte b, int BitNumber) 
    { 
     if (BitNumber < 8 && BitNumber > -1) 
     { 
      return (byte)(b | (byte)(0x01 << BitNumber)); 
     } 
     else 
     { 
      throw new InvalidOperationException(
      "Der Wert für BitNumber " + BitNumber.ToString() + " war nicht im zulässigen Bereich! (BitNumber = (min)0 - (max)7)"); 
     } 
    } 

    private static byte unsetBit(byte b, int BitNumber) 
    { 
     if (BitNumber < 8 && BitNumber > -1) 
     { 
      return (byte)(b | (byte)(0x00 << BitNumber)); 
     } 
     else 
     { 
      throw new InvalidOperationException(
      "Der Wert für BitNumber " + BitNumber.ToString() + " war nicht im zulässigen Bereich! (BitNumber = (min)0 - (max)7)"); 
     } 
    } 
+0

有是在.NET框架沒有這樣的方法......你嘗試過什麼?什麼不工作?你的目標究竟是什麼? – Yahia 2012-04-15 10:43:54

+0

以及我認爲可能有一個現有的方法,將生成一個像MAC字符串格式的數字。如果沒有,我必須自己寫... – MUG4N 2012-04-15 10:47:58

+1

你只需要在最左邊的字節上旋轉,而不是全部。而且您不需要編寫方法來設置和清除位:使用|和&運營商。 – EJP 2012-04-15 22:21:11

回答

3

有在.NET框架沒有這樣的方法......

你需要寫一個自己 - 讀format description,使用random generator得到0和255之間的6張隨機數,設置2相關位(全局唯一/局部施用),爲需要的話,然後transform the number to hex(即X2,每數2個位數,左填充0)和join these together with : as delimiter ...

+0

thx到目前爲止,這正是我期望在這裏實現的。我會試一試 – MUG4N 2012-04-15 10:50:24

+0

@ MUG4N歡迎您:-)我添加了一些MSDN鏈接相關的方法等HTH – Yahia 2012-04-15 10:54:55

-1

沒有一個內.NET功能生成MAC地址。它必須寫。

MAC地址通常是唯一的,由NIC的OEM設置。不同的製造商有一定的分配前綴。樣本列表可以在這裏找到; https://code.wireshark.org/review/gitweb?p=wireshark.git;a=blob_plain;f=manuf

關於我的頭頂,我不知道任何生成MAC地址的庫(因爲它不是一個常見的要求),但是創建一個地址不會太困難,因爲地址是從00到FF只需6個十六進制值,用冒號分隔。

7

稍微更簡潔的解決方案(我認爲仍然達到相同的結果):

public static string GetRandomMacAddress() 
{ 
    var random = new Random(); 
    var buffer = new byte[6]; 
    random.NextBytes(buffer); 
    var result = String.Concat(buffer.Select(x => string.Format("{0}:", x.ToString("X2"))).ToArray()); 
    return result.TrimEnd(':'); 
} 

這給出了一個格式化的MAC,刪除的String.format如果未格式化需要

2

MUG4N的解決方案有微調一個問題。你必須調整最重要的兩位而不是最重要的兩位。

所以不是

b = setBit(b, 6); //--> set locally administered 
b = unsetBit(b, 7); // --> set unicast 

應該

b = setBit(b, 1); //--> set locally administered 
b = unsetBit(b, 0); // --> set unicast 

另外,unsetBit()不正確。有關行應該是

return unchecked((byte)(b & (byte)~(0x01 << BitNumber))); 

當然,它很可能是簡單的把它改成這樣:

if (i == 0) 
{ 
    b = (byte)((b & 0xFE) | 0x02) //-->set locally administered and unicast 
} 
0

對於那些你們誰有一個問題產生了新的MAC地址,您的WiFi小更新-適配器。您只需將MAC地址的第一個字節設置爲「02」,而不是通常爲「00」。設置第一個字節「02」實際上設置了b2位,表示MAC地址是本地管理的。

enter image description here

你可以閱讀更多關於它在這裏: http://blog.technitium.com/2011/05/tmac-issue-with-wireless-network.html

代碼:

public static string GetRandomWifiMacAddress() 
{ 
    var random = new Random(); 
    var buffer = new byte[6]; 
    random.NextBytes(buffer); 
    buffer[0] = 02; 
    var result = string.Concat(buffer.Select(x => string.Format("{0}", x.ToString("X2"))).ToArray()); 
    return result; 
} 
0

這裏是一個輔助類來生成隨機的MAC。

public static class MacAddress 
{ 
    private static readonly Random Random = new Random(); 

    public static string GetSignatureRandomMac(string generic = "AA") 
    { 
     string[] macBytes = new[] 
     { 
      generic, 
      generic, 
      generic, 
      Random.Next(1, 256).ToString("X"), 
      Random.Next(1, 256).ToString("X"), 
      Random.Next(1, 256).ToString("X") 
     }; 

     return string.Join("-", macBytes); 
    } 

    public static string GetRandomMac() 
    { 
     string[] macBytes = new[] 
     { 
      Random.Next(1, 256).ToString("X"), 
      Random.Next(1, 256).ToString("X"), 
      Random.Next(1, 256).ToString("X"), 
      Random.Next(1, 256).ToString("X"), 
      Random.Next(1, 256).ToString("X"), 
      Random.Next(1, 256).ToString("X") 
     }; 

     return string.Join("-", macBytes); 
    } 
} 

用法:

Console.WriteLine(MacAddress.GetRandomMac()); 
Console.WriteLine(MacAddress.GetSignatureRandomMac()); 
Console.WriteLine(MacAddress.GetSignatureRandomMac("BB"));