6

我正在寻找 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)");
        }
    }
4

7 回答 7

11

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

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

于 2013-10-31T00:01:36.213 回答
4

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

您需要自己编写一个 - 阅读格式说明,使用随机生成器获取 0 到 255 之间的 6 个随机数,根据需要设置 2 个相关位(用于全局唯一/本地管理),然后将数字转换为十六进制(即X2,每个数字 2 位,左侧填充 0)并将它们连接在一起:作为分隔符...

于 2012-04-15T10:49:00.740 回答
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
}
于 2014-01-22T22:15:19.897 回答
1

为您在为 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;
}
于 2016-01-05T07:19:40.683 回答
1

这是一个生成随机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"));
于 2016-12-14T08:49:08.940 回答
1

我们可以生成一个随机数,并且我们可以使用按位运算符仅修改第一个字节的最后 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;
    }
于 2021-03-02T03:07:28.633 回答
-1

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

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

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

于 2012-04-15T10:49:01.600 回答