【问题标题】:Generate a random mac address生成随机mac地址
【发布时间】:2012-04-15 10:42:34
【问题描述】:

我正在寻找一种在 C# 中生成随机 MAC 号的方法。谷歌在那个方面相当薄弱。

非常感谢

解决方案:

在 Yahia 的帮助下,我能够编写以下解决方案。再次感谢!

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

【问题讨论】:

  • .NET 框架中没有这样的方法...你试过什么?什么不工作?你的目标到底是什么?
  • 好吧,我认为可能有一种现有的方法可以生成格式为 MAC 字符串的数字。如果不是我必须自己写...
  • 您只需要在最左边的字节上旋转那个位,而不是全部。而且您不需要编写方法来设置和清除位:使用 |和 & 运算符。
  • 我很困惑。为什么要设置第一个字节的高位?我认为单播\多播位是第一个字节的最低位,全局唯一\本地管理的是第一个字节的第二个最低位。 en.wikipedia.org/wiki/MAC_address
  • 这个方法好像还是生成无效的mac地址

标签: c# networking


【解决方案1】:

稍微不那么冗长的解决方案(我认为仍然可以达到相同的结果):

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 和 Trim

【讨论】:

    【解决方案2】:

    .NET框架中没有这样的方法...

    您需要自己编写一个 - 阅读 format description,使用 random generator 获取 0 到 255 之间的 6 个随机数,根据需要设置 2 个相关位(用于全局唯一/本地管理),然后transform the number to hex(即X2,每个数字2位,左侧填充0)和join these together with : as delimiter...

    【讨论】:

    • thx 到目前为止,这正是我希望在这里实现的目标。我试试看
    • @MUG4N 不客气 :-) 我为相关方法等添加了一些 MSDN 链接。HTH
    【解决方案3】:

    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
    }
    

    【讨论】:

      【解决方案4】:

      为那些在为 Wifi 适配器生成新 MAC 地址时遇到问题的人提供小更新。您只需将 MAC 地址的第一个八位字节设置为“02”,而不是通常设置为“00”。设置第一个八位字节“02”实际上设置了 b2 位,指示 MAC 地址是本地管理的。

      您可以在此处阅读更多信息: 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;
      }
      

      【讨论】:

        【解决方案5】:

        这是一个生成随机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"));
        

        【讨论】:

        • 使用 ".ToString("X2")" 而不是 ".ToString("X")" 否则您有时会得到一些单个值,从而导致 MAC 地址少于 12 个字符。
        【解决方案6】:

        我们可以生成一个随机数,我们可以使用位运算符只修改第一个字节的最后 2 位:

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

        【讨论】:

          【解决方案7】:

          .NET 中没有生成 MAC 地址的功能。它必须写出来。

          MAC 地址通常是唯一的,由 NIC 的 OEM 设置。不同的制造有一定的分配前缀。可以在此处找到示例列表; https://code.wireshark.org/review/gitweb?p=wireshark.git;a=blob_plain;f=manuf

          在我的脑海中,我不知道存在任何用于生成 MAC 地址的库(因为这不是一个常见的要求),但是创建一个库并不难,因为地址只是 6从 00 到 FF 的十六进制值,以冒号分隔。

          【讨论】:

            猜你喜欢
            • 2014-08-07
            • 2012-03-03
            • 2017-10-02
            • 1970-01-01
            • 2012-05-03
            • 1970-01-01
            • 2014-12-10
            • 2019-10-26
            • 1970-01-01
            相关资源
            最近更新 更多