Как проверить, является ли это допустимой сетевой маской?

#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 ? Если он по-прежнему не выдает желаемый результат, можете ли вы указать ввод, для которого программа завершается с ошибкой?