构建一个包含 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()
函数创建一个数组,其中包含从第一个参数到第二个参数的整数(如果要更改之间的步骤,请使用可选的第三个参数)。
我是用16进制写数字的,这也是这里限制为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;
}
我想构建一个数组,其中包含基于 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()
函数创建一个数组,其中包含从第一个参数到第二个参数的整数(如果要更改之间的步骤,请使用可选的第三个参数)。
我是用16进制写数字的,这也是这里限制为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;
}