2015-02-23 53 views
1

我有一些python代码,我想在100%php代码中使用。你有什么想法,我可以如何转换代码?我在转换代码时遇到了问题,特别是部分获取位和设置位。在php中转换python代码的最佳方法用于SNMP VLAN掩码的位掩码计算

通过snmp从交换机读取位掩码,并且掩码表示巫婆端口在定义的vlan中。例如:

snmpget 1.3.6.1.2.1.17.7.1.4.3.1.2。返回一个HEX字符串,如F100000000000000

每十六进制数字代表交换机的4个物理LAN端口。这个例子中的第一个数字是F,意思是二进制1111.这意味着1-4中的每个端口都在vlan中。

如果只想端口1,2和4面膜会1101是十六进制D.

代码的目的是我想知道的,例如,如果端口15是在VLAN或不(getbitatposition),如果不是,我可以改变端口位置的掩码(setbitatposition)。

端口15例如是在炭4左起:

F =端口1-4

1 =端口5-8

0 =端口9-12

0 =端口13-16 =>十六进制0 =>二进制0000

要获得vlan中的端口15,我必须将第三位从0000更改为0010,并将其转换回十六进制=> 2.

新的面具将是例如F102000000000000

的Python代码:

def convertHexCharacterToInt(char): 
    if (char.upper() == "A"): 
     return 10 
    elif (char.upper() == "B"): 
     return 11 
    elif (char.upper() == "C"): 
     return 12 
    elif (char.upper() == "D"): 
     return 13 
    elif (char.upper() == "E"): 
     return 14 
    elif (char.upper() == "F"): 
     return 15 
    else: 
     return (int(char)) 

def convertIntToHexCharacter(integer): 
    if (integer < 0 or integer > 15): 
     return "-1" 

    if (integer < 10): 
     return str(integer) 
    elif (integer == 10): 
     return "A" 
    elif (integer == 11): 
     return "B" 
    elif (integer == 12): 
     return "C" 
    elif (integer == 13): 
     return "D" 
    elif (integer == 14): 
     return "E" 
    elif (integer == 15): 
     return "F" 

def __getBitAtPosition(position, bitmap): 

    for x in range(0, len(bitmap)): 
     mask = 0x8 
     for y in range(0, 4): 
      if (((x * 4) + y + 1) == position): 
       return (convertHexCharacterToInt(bitmap[x]) & mask) != 0 
      mask = mask >> 1 

    return None 

def __setBitAtPosition(position, bitmap, value): 

    if (__getBitAtPosition(position, bitmap) == value): 
     return bitmap 

    charPosition = (position + 3)/4 - 1 
    bitPosition = int(math.fabs((position - (charPosition * 4)) - 4)) 

    bitValue = 2 ** bitPosition 
    fourBitValue = convertHexCharacterToInt(bitmap[charPosition]) 

    newValue = None 

    if (value): 
     newValue = fourBitValue + bitValue 
    else: 
     newValue = fourBitValue - bitValue 
    newBitmap = bitmap[:charPosition] + convertIntToHexCharacter(newValue) + bitmap[charPosition + 1:] 
    return newBitmap 

这是我第一次尝试,但结果是不一样的:

private function _convertHexCharacterToInt($char){ 

    if (strtoupper($char) == "A"){ 
     return 10;} 
    elseif (strtoupper($char) == "B"){ 
     return 11;} 
    elseif (strtoupper($char) == "C"){ 
     return 12;} 
    elseif (strtoupper($char) == "D"){ 
     return 13;} 
    elseif (strtoupper($char) == "E"){ 
     return 14;} 
    elseif(strtoupper($char) == "F"){ 
     return 15;} 
    else { 
     return $char; 
    } 
} 

private function _getBitAtPosition($pos,$bitmap){ 

    foreach(range(0,strlen($bitmap)) as $x){ 
    $mask=0x8; 

    foreach(range(0,3) as $y){ 
     if((($x * 4) + $y + 1) == $pos){ 

     if($this->_convertHexCharacterToInt(substr($bitmap,$x,1))&$mask != 0{ 
      return $this->_convertHexCharacterToInt(substr($bitmap,$x,1))&$mask; 
     } 

     $mask = $mask >> 1 

     } 
    } 

    } 

} 
+0

起初:你重新发明了车轮。 Python('hex(x)','int(x,16)')和PHP('hexdec(x)','dechex(x)')都具有内置函数来执行int - hex转换。另外,对于你期望其他两个功能所做的描述也是有帮助的。什么是位图(类型,示例数据)? – 2015-02-23 10:03:05

+0

你是对的我已经改造了车轮。:-) – max 2015-02-23 10:34:07

+0

我已经找到了自己的解决方案后,一些问题转换不是我最喜欢的爱好... – max 2015-02-23 19:47:19

回答

0

我能解决第一部分,我认为它的工作:

private function _getBitAtPosition($pos,$bitmap){ 

    for($x=0;$x<strlen($bitmap);$x++){ 
    $mask=0x8; 

    for($y=0;$y<4;$y++){ 
     if((($x * 4) + $y + 1) == $pos){ 
     if((hexdec(substr($bitmap,$x,1))&$mask) != 0){ 
      return True; 
     }  
     } 
     $mask = $mask >> 1; 
    } 

    } 

} 
0

我还发现了第二部分的解决方案可能是不漂亮的代码,但功能:

private function _setBitAtPosition($pos,$bitmap,$value){ 

if($this->_getBitAtPosition($pos,$bitmap) == $value){ 
    return $bitmap; 
} 

    $charpos = intval((($pos + 3)/4 - 1)); 
    $bitpos = abs(($pos - ($charpos * 4)) - 4); 
    $bitvalue = pow(2,$bitpos); 

$fourbitvalue=hexdec(substr($bitmap,$charpos,1)); 

$newvalue = 0; 

if($value){ 
    $newvalue = $fourbitvalue + $bitvalue; 
} else { 
    $newvalue = $fourbitvalue - $bitvalue; 
} 

$newbitmap = substr($bitmap,0,$charpos).dechex($newvalue).substr($bitmap,$charpos+1); 

return $newbitmap; 
} 
0

这里是我的Perl函数至极给人以范围设定位位置的列表。我使用它解析vlan成员的位掩码,但没关系。 例如:

# ./test.pl 6E 
1-2,4-6 

# ./test.pl FF 
0-7 

# ./test.pl 7fe7fffffe 
1-10,13-38 

来源:

sub vlans_list { 
    my $raw=shift; 
    my $cur_vlan=0; 
    my $last_vlan=undef; 
    my $seq_start=undef; 
    my $list=undef; 
    foreach my $octet (split('', $raw)) { 
    $octet = hex($octet); 
    for(my $i=0; $i < 4; $i++) { 
     if($octet & 0x8) { 
     if(defined($seq_start) && ($cur_vlan-$last_vlan) == 1) { 
      $last_vlan=$cur_vlan; 
     } elsif(!defined($seq_start)) { 
      $seq_start=$cur_vlan; 
      $last_vlan=$cur_vlan; 
     } else { 
      print("ERROR: vlans_list: sequencing error\n"); 
     }; 
     } else { 
     if(defined($seq_start)) { 
      if(defined($list)) { 
      $list .= ",$seq_start"; 
      } else { 
      $list = "$seq_start"; 
      }; 
      if($seq_start != $last_vlan) { 
      $list .= "-$last_vlan"; 
      }; 
      $seq_start=undef; 
      $last_vlan=undef; 
     }; 
     }; 
     $cur_vlan++; 
     $octet= $octet << 1; 
    }; 
    }; 
    if(defined($seq_start)) { 
    if(defined($list)) { 
     $list .= ",$seq_start"; 
    } else { 
     $list = "$seq_start"; 
    }; 
    if($seq_start != $last_vlan) { 
     $list .= "-$last_vlan"; 
    }; 
    }; 
    if(!defined($list)) { 
    $list=""; 
    }; 
    return $list; 

}; 
+0

荣誉。这适用于查找.1.3.6.1.2.1.17.7.1.4.2.1.4中的Q-BRIDGE-MIB中VLAN的出站端口。然而,在我们的设备上,我必须从1开始计数端口('my $ cur_vlan = 1') – Marki 2016-04-04 17:39:47