2012-04-15 125 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"));