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