生成随机MAC地址的生成器仅生成单播MAC地址

5
这是我的简易MAC地址生成器:
private String randomMACAddress(){
    Random rand = new Random();
    byte[] macAddr = new byte[6];
    rand.nextBytes(macAddr);

    StringBuilder sb = new StringBuilder(18);
    for(byte b : macAddr){
        if(sb.length() > 0){
            sb.append(":");
        }else{ //first byte, we need to set some options
            b = (byte)(b | (byte)(0x01 << 6)); //locally adminstrated
            b = (byte)(b | (byte)(0x00 << 7)); //unicast

        }
        sb.append(String.format("%02x", b));
    }


    return sb.toString();
}

请注意我如何设置和取消位以生成单播mac地址。然而,它并没有起作用,我的自动程序接受mac地址时返回了一个错误,因为“这个mac地址是多播的”。 我做错了什么?
4个回答

9
解决了...我只是做了
private String randomMACAddress(){
    Random rand = new Random();
    byte[] macAddr = new byte[6];
    rand.nextBytes(macAddr);

    macAddr[0] = (byte)(macAddr[0] & (byte)254);  //zeroing last 2 bytes to make it unicast and locally adminstrated

    StringBuilder sb = new StringBuilder(18);
    for(byte b : macAddr){

        if(sb.length() > 0)
            sb.append(":");

        sb.append(String.format("%02x", b));
    }


    return sb.toString();
}

将最后一位清零将使其成为单播地址,但要将其视为本地管理地址,则最高有效位的倒数第二位应为“1”:https://en.wikipedia.org/wiki/MAC_address - Twaha Mehmood

0
public String generateRandomMacAddress() {
      Random r = new Random();
      return RandomStringUtils.randomAlphabetic(1) + r.nextInt(11)+ ":" +
              r.nextInt(11) + r.nextInt(11) + ":" +
              RandomStringUtils.randomAlphabetic(2)+":"+
              r.nextInt(11)+RandomStringUtils.randomAlphabetic(1)+":"+
              r.nextInt(11)+RandomStringUtils.randomAlphabetic(1);
   }

``


2
你的答案可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是否正确。您可以在帮助中心找到有关编写良好答案的更多信息。 - Community

0
如果最高有效地址八位中的最低有效位设置为1,则帧仍将仅发送一次;但是,NIC将根据除匹配MAC地址之外的其他标准选择接受它:例如,基于可配置的接受多播MAC地址列表。这称为多播寻址。

那么...这是反过来的吗?纠正这一行 b = (byte)(b | (byte)(0x00 << 7)); //使用0x01的单播是否可以? - Phate

0
对于一个随机的MAC地址,这里几乎可以用一行代码实现
import 'dart:math';

Random r = Random();
String mac = List.generate(6, (_) => r.nextInt(256).toRadixString(16).padLeft(2, '0')).join(":");

print("mac is $mac"); // mac is 8f:e0:63:e0:92:60

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接