2015-05-21 15 views
2

我想构建一个包含基于3个变量的MAC地址完整列表的阵列:前缀,开始和结束。用一系列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; 
} 

有人可以帮我吗?

+1

你为什么不只是使用'hexdec'和'dechex'以数字和MAC地址使用十六进制字符串之间进行转换? – Barmar

+0

我实际上并没有意识到这两个功能。说实话,我不明白MAC地址的构建方式。这使得一切都变得更容易,更容易理解!谢谢! – Bob

+0

你不知道MAC地址是十六进制数字吗?如果不知道基本知识,你会如何结束这样的项目,而不做一些研究?所有你需要做的就是阅读维基百科页面,它解释了这一点:_用于以人性化的形式打印MAC-48地址的标准(IEEE 802)格式是六个组,由两个十六进制数字组成,用连字符( - )或冒号:),_ – Barmar

回答

3

运行范围应该是很容易的,假设你使用的是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中,应该使用。 :)

+0

感谢您的解答并解释。我的PHP版本是64位的。这可能是一个愚蠢的后续问题:我怎样才能将十六进制书写与变量结合使用?只需'0x。 $ mac'不起作用。 – Bob

+0

我发现了一些挖掘后的解决方案:'hexdec(“\ x00”。$ mac)'。再次感谢您的干净解决方案。 – Bob

-2

这将帮助十六进制部分:

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; 
} 
+0

我们使用PHP来解决这个问题,而不是Java。 – Sven

+0

uhhhhh我的意思是伪代码。是的,类似于java的伪代码... – oMiKeY

+1

伪代码意味着它不会帮助。 – Sven