1

100% php コードで使用したい python コードがあります。コードを変換する方法はありますか??? コードの変換、特に get bit と set bit の部分に問題があります。

ビットマスクは、snmp を介してスイッチから読み取られ、マスクは、定義された VLAN 内にあるウィッチ ポートを表します。例:

snmpget 1.3.6.1.2.1.17.7.1.4.3.1.2。F100000000000000 のような HEX 文字列を返します

すべての 16 進数は、スイッチの 4 つの物理 LAN ポートを表します。この例の最初の桁は F で、バイナリ 1111 を意味します。これは、1 ~ 4 のすべてのポートが VLAN にあることを意味します。

ポート 1、2、および 4 のみが必要な場合、マスクは 1101 になり、16 進 D になります。

コードの目的は、たとえば、ポート 15 が VLAN にあるかどうか (getbitatposition) を知りたいこと、そうでない場合は、ポートの位置でビットマスクを変更できること (setbitatposition) を知りたいことです。

たとえば、ポート 15 は左から 4 文字目にあります。

F = ポート 1 ~ 4

1 = ポート 5 ~ 8

0 = ポート 9 ~ 12

0 = ポート 13 ~ 16 => HEX 0 => バイナリ 0000

VLAN でポート 15 を取得するには、3 番目のビットを 0000 から 0010 に変更し、16 進数 => 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

      }
    }

    }

}
4

3 に答える 3

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

    }

}
于 2015-02-23T15:40:55.797 に答える