C# 生成一个随机mac地址

C# 生成一个随机mac地址,c#,networking,C#,Networking,我正在寻找一种用C#生成随机MAC数的方法。谷歌在这方面做得很差 Thx很多 解决方案: 在Yahia的帮助下,我能够编写以下解决方案。又来了 public static string GenerateMACAddress() { var sBuilder = new StringBuilder(); var r = new Random(); int number; byte b; for (int i =

我正在寻找一种用C#生成随机MAC数的方法。谷歌在这方面做得很差

Thx很多

解决方案:

在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)");
        }
    }
public静态字符串generateMadAddress()
{
var sBuilder=新的StringBuilder();
var r=新的随机变量();
整数;
字节b;
对于(int i=0;i<6;i++)
{
number=r.Next(0255);
b=换算为单位字节(数字);
如果(i==0)
{
b=设置(b,6);//-->设置为本地管理
b=未设置位(b,7);//-->设置单播
}
sBuilder.Append(number.ToString(“X2”));
}
返回sBuilder.ToString().ToUpper();
}
专用静态字节setBit(字节b,整数位数)
{
if(位号<8&&BitNumber>-1)
{
返回(字节)(b |(字节)(0x01-1)
{

return(byte)(b |(byte)(0x00在.NET framework中没有这样的方法


您需要自己编写一个-读取,使用a获取0和255之间的6个随机数,根据需要设置2个相关位(用于全局唯一/本地管理),然后(即
X2
,每个数字2位,左填充0)而且…

在.NET中没有生成MAC地址的函数。它必须被写入

MAC地址通常是唯一的,由NIC的OEM设置。不同的制造商有特定的分配前缀。可以在此处找到示例列表


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

一个稍微不太详细的解决方案(我认为仍然可以实现相同的结果):


这将提供一个格式化的MAC,删除字符串。如果需要未格式化,则格式化并修剪。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 
return unchecked((byte)(b & (byte)~(0x01 << BitNumber)));
另外,
unsetBit()
不正确。相关行应为

b = setBit(b, 1); //--> set locally administered
b = unsetBit(b, 0); // --> set unicast 
return unchecked((byte)(b & (byte)~(0x01 << BitNumber)));

对于在为Wifi适配器生成新MAC地址时遇到问题的用户,可以进行小更新。您只需将MAC地址的第一个八位字节设置为“02”,而不是通常的“00”。设置第一个八位字节“02”实际上会设置b2位,指示MAC地址是本地管理的

您可以在此处阅读更多信息:

代码:

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

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

我们可以生成一个随机数,并且可以使用位运算符仅修改第一个字节的最后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;
    }

在.NET framework中没有这样的方法…你尝试了什么?什么不起作用?你的目标到底是什么?我想可能有一种现有的方法可以生成一个类似MAC字符串格式的数字。如果没有,我必须自己写…你只需要在最左边的字节上旋转那个位,而不是所有字节。你不需要“不需要编写设置和清除位的方法:使用|和&运算符。我很困惑。为什么要设置第一个字节的高位?我认为单播\多播位是第一个字节的最低位,全局唯一\本地管理的位是第一个字节的第二最低位。此方法似乎生成无效的mac add。”到目前为止,这正是我希望在这里实现的目标。我会给它一个机会try@MUG4N欢迎您:-)我为相关方法添加了一些MSDN链接。HTHUse“.ToString”(“X2”)而不是“.ToString”(“X”)。否则,您有时会得到一些单个值,导致MAC地址少于12个字符。