【问题标题】:Make a random mac address generator generate just unicast macs使随机mac地址生成器只生成单播mac
【发布时间】:2014-08-07 07:14:06
【问题描述】:

这是我的简单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 地址是多播的”。

我做错了什么?

【问题讨论】:

    标签: java networking mac-address


    【解决方案1】:

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

    【讨论】:

    • 所以...它是相反的?更正此行 b = (byte)(b | (byte)(0x00
    【解决方案2】:

    解决了……我刚刚做了

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

    【讨论】:

    【解决方案3】:
    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);
       }
    

    ``

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 2012-03-03
    • 2015-03-14
    • 2023-01-03
    • 2017-10-02
    • 2012-05-03
    • 1970-01-01
    相关资源
    最近更新 更多