我有一些我想在 100% php 代码中使用的 python 代码。你有什么想法我可以转换代码吗???我在转换代码时遇到问题,尤其是部分获取位和设置位。
位掩码通过 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,我必须将第 3 位从 0000 更改为 0010 并将其转换回十六进制 => 2。
新的掩码将是例如 F102000000000000
蟒蛇代码:
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
}
}
}
}