我在C#中寻找一种生成随机MAC号的方法。谷歌在这方面相当薄弱。
很多
SOLUTION:
在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)");
}
}
答案 0 :(得分:10)
稍微不那么详细的解决方案(我认为仍然可以达到相同的结果):
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
答案 1 :(得分:4)
.NET框架中没有这样的方法......
您需要自己编写一个 - 阅读format description,使用random generator获取0到255之间的6个随机数,设置2个相关位(全局唯一/本地管理)需要然后transform the number to hex(即X2
,每个数字2位数,左边用0填充)和join these together with :
as delimiter ...
答案 2 :(得分: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
}
答案 3 :(得分:1)
对于那些在为Wifi适配器生成新MAC地址时遇到问题的人的小更新。您只需将MAC地址的第一个八位字节设置为&#34; 02&#34;,而不是通常为&#34; 00&#34;。设置第一个八位字节&#34; 02&#34;实际上设置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;
}
答案 4 :(得分: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;
}
答案 5 :(得分: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"));
答案 6 :(得分:-1)
.NET中没有用于生成MAC地址的功能。它必须写出来。
MAC地址通常是唯一的,由NIC的OEM设置。不同的制造商有一定的分配前缀。可在此处找到样本列表; https://code.wireshark.org/review/gitweb?p=wireshark.git;a=blob_plain;f=manuf
在我的脑海中,我不知道存在任何生成MAC地址的库(因为它不是常见的要求),但是创建一个地址就不是太难了只是6从冒号分隔的00到FF的十六进制值。