Я хочу создать массив, который содержит полный список 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 символов или меньше, wordwrap()
строки. Я немного злоупотребляю им, чтобы разделить шестнадцатеричное число на единицы из 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; }