#python #ip #netmask
#python #ip #сетевая маска
Вопрос:
Мой код должен возвращать допустимую сетевую маску. Он должен проверять двоичное представление, является ли оно True
или False
.
В моем коде что-то не так. когда я проверяю 1
, он говорит, что первое значение равно true, а второе — false… Все 1
должны возвращать True
и все 0 должны возвращать False
.
def is_valid_netmask(numberlist):
ips = numberlist
result = True
#for ip in ips:
#num = int(ip)
#if not (num >= 0 and num <= 255):
#result = False
if len(ips) != 4:
return False
if result == False:
print("not valid")
else:
print("valid")
octet = ips
octet_bin = [format(int(i), '08b') for i in octet]
binary_netmask = ("").join(octet_bin)
print(binary_netmask)
checking_ones = True
for symbol in binary_netmask:
print("the current symbol is ", symbol)
print(f"I only encountered one so far: {checking_ones}")
if checking_ones and symbol == "0":
print("so i know that the netmask is not valid")
return False
elif symbol == "1":
checking_ones = False
print("I'm done so I know the netmask is valid")
return True
Вывод
valid
11111111111111111111111100000000
the current symbol is 1
I only encountered one so far: True #correct
the current symbol is 1
I only encountered one so far: False #not correct
the current symbol is 1
I only encountered one so far: False #not correct
the current symbol is 1
I only encountered one so far: False #not correct
the current symbol is 1
I only encountered one so far: False #not correct
the current symbol is 1
I only encountered one so far: False #not correct
the current symbol is 1
I only encountered one so far: False #not correct
the current symbol is 1
I only encountered one so far: False #not correct
the current symbol is 1
I only encountered one so far: False #not correct
the current symbol is 1
I only encountered one so far: False #not correct
the current symbol is 1
I only encountered one so far: False #not correct
the current symbol is 1
I only encountered one so far: False #not correct
the current symbol is 1
I only encountered one so far: False #not correct
the current symbol is 1
I only encountered one so far: False #not correct
the current symbol is 1
I only encountered one so far: False #not correct
the current symbol is 1
I only encountered one so far: False #not correct
the current symbol is 1
I only encountered one so far: False #not correct
the current symbol is 1
I only encountered one so far: False #not correct
the current symbol is 1
I only encountered one so far: False #not correct
the current symbol is 1
I only encountered one so far: False #not correct
the current symbol is 1
I only encountered one so far: False #not correct
the current symbol is 1
I only encountered one so far: False #not correct
the current symbol is 1
I only encountered one so far: False #not correct
the current symbol is 1
I only encountered one so far: False #notcorrect
the current symbol is 0
I only encountered one so far: False #correct
the current symbol is 0
I only encountered one so far: False #correct
the current symbol is 0
I only encountered one so far: False #correct
the current symbol is 0
I only encountered one so far: False #correct
the current symbol is 0
I only encountered one so far: False #correct
the current symbol is 0
I only encountered one so far: False #correct
the current symbol is 0
I only encountered one so far: False #correct
the current symbol is 0
I only encountered one so far: False #correct
I'm done so I know the netmask is valid
True
Комментарии:
1. Если символ равен «1», вы устанавливаете
checking_ones
значениеFalse
. Проблема, вероятно, возникает оттуда.
Ответ №1:
[редактировать] Приношу свои извинения, я запутался в своем первоначальном ответе.
Когда мы начнем проверять биты, нам нужно, чтобы первая цифра была равна 1. Тогда мы сможем принять как можно больше из них. Однако, как только мы сталкиваемся с 0, мы можем принимать только нули для оставшихся битов.
accept_zero_only = False
first_bit = True
for symbol in binary_netmask:
print("the current symbol is ", symbol)
print("Did I encounter a 0 so far?" accept_zero_only)
if accept_zero_only and symbol == "1":
print("so i know that the netmask is not valid")
return False
elif symbol == "0":
print("Encountered a zero! From now on we are only accepting zeros."
accept_zero_only = True
if first_bit and symbol == "0":
print(" First bit should be a 1!")
return False
first_bit = False
[edit2] Я интегрировал вышесказанное в ваш оригинальный скрипт с несколькими незначительными изменениями и запустил его для следующих результатов.
def is_valid_netmask(numberlist):
ips = numberlist
if len(ips) != 4:
print "Input array should contain 4 numbers, was:" , len(ips)
return False
for ip in ips:
num = int(ip)
if not (num >= 0 and num <= 255):
print "Array contained number", ip, "which is not in [0,255] range."
return False
octet = ips
octet_bin = [format(int(i), '08b') for i in octet]
binary_netmask = ("").join(octet_bin)
print(binary_netmask)
accept_zero_only = False
first_bit = True
for symbol in binary_netmask:
if accept_zero_only and symbol == "1":
print("Netmask is not valid, contains alternating 1s and 0s and 1s again")
return False
elif symbol == "0":
accept_zero_only = True
if first_bit and symbol == "0":
print("First bit should be a 1, netmask is not valid")
return False
first_bit = False
print("Netmask is valid")
return True
print is_valid_netmask([255,255,0,0,0]) # False
print is_valid_netmask([256,255,255,255]) # False
print is_valid_netmask([255,0,0,0]) # True
print is_valid_netmask([192,0,0,0]) # True
print is_valid_netmask([0,255,255,255]) # False
print is_valid_netmask([255,0,255,0]) # False
Вполне возможно, что я пропустил крайний случай. Если вышеприведенная программа не дает вам желаемого результата, не могли бы вы сообщить нам о проблемах в комментариях ниже?
Комментарии:
1. Я использовал ваш код, но он не работает. это все еще не дает правильного результата
2. О! Мой плохой. Я думаю, что я это исправил.
3. Можете ли вы проверить программу edit2 ? Если он по-прежнему не выдает желаемый результат, можете ли вы указать ввод, для которого программа завершается с ошибкой?