构建一个包含一系列MAC地址的数组


Build an array with a range of MAC addresses

我想建立一个数组,其中包含基于3个变量的MAC地址的完整列表:前缀,开始和结束。

假设我有20:1E:50:3F:8A作为前缀,3E作为开始,43作为结束。这将生成以下MAC地址数组:

20:1E:50:3F:8A:3E
20:1E:50:3F:8A:3F
20:1E:50:3F:8A:40
20:1E:50:3F:8A:41
20:1E:50:3F:8A:42
20:1E:50:3F:8A:43

我试了一下,但它还没有起作用,我不明白:

function generate($prefix, $start, $end){
    $start = str_split($start);
    $end = str_split($end);
    $start_first = $start[0];
    $start_second = $start[1];
    $end_first = $end[0];
    $end_second = $end[1];
    if(is_numeric($start_second)){
        $start_second_numeric = true;
    }
    else{
        $start_second_numeric = false;
    }
    if(is_numeric($end_second)){
        $end_second_numeric = true;
    }
    else{
        $end_second_numeric = false;
    }
    $mac_array = array();
    $range_first = range($start_first, $end_first);
    foreach($range_first as $first_character){
        if($start_second_numeric && $end_second_numeric || !$start_second_numeric && !$end_second_numeric){
            $range_second = range($start_second, $end_second);
        }
        elseif(!$start_second_numeric && $end_second_numeric){
            $range_second = range($start_second, "F");
            $range_third = range("0", $end_second);
        }
        elseif($start_second_numeric && !$end_second_numeric){
            $range_second = range($start_second, "9");
            $range_third = range("A", $end_second);
        }
        foreach($range_second as $second_character){
            $string = $prefix . ":" . $first_character . $second_character;
            array_push($mac_array, $string);
        }
        if(is_array($range_third)){
            foreach($range_third as $second_character){
                $string = $prefix . ":" . $first_character . $second_character;
                array_push($mac_array, $string);
            }
        }
    }
    return $mac_array;
}
有人能帮我一下吗?

运行该范围应该非常容易,假设您使用的是64位PHP:

$mac_array = range(0x201E503F8A3E, 0x201E503F8A43);
foreach ($mac_array as $mac) {
    echo wordwrap(sprintf("%012X", $mac), 2, ":", true);
}

这是怎么回事?

range()函数创建一个数组,包含从第一个参数到第二个参数的整数(如果您想改变两者之间的步长,请使用可选的第三个参数)。

我使用数字的十六进制书写,这也是限制64位PHP的原因,因为MAC地址长于32位,准确地说是48位。

foreach遍历整型数组。

现在对于每个整数,都要进行一些格式化。sprintf()对于格式化字符串很有用-在本例中,我希望它打印至少有12位数字的十六进制数,并用零填充它们。这就是字符串"%012X"的作用。

wordwrap()是一个使用链接字符将字符串分割成更小的单元的函数,默认情况下将字符串分割成75个字符或更少的几行,并使用换行符进行链接。我在这里滥用了它,将十六进制数分成2个字符的单位,并用冒号连接它们。

所有这些都已经内置到PHP中,应该使用。:)

这将有助于十六进制部分:

public String[] range (String hexStart, String hexEnd)
{
    int start = Long.parseLong(hexStart, 16);
    int end = Long.parseLong(hexEnd, 16);
    String array[] = new String[end-start];
    for(int i = start; i < end; i++)
    {
        array[i] = Integer.valueOf(String.valueOf(i), 16);
    }
    return array;
}