2015-03-07 4 views
1

Я пытаюсь преобразовать 4 введенных октета IP-адреса в их двоичную форму. Это только часть кода для преобразования первого октета в его 8-битную форму. «oc» - октет - я исправлю имена переменных, когда я получу эту работу.Преобразование ip в двоичный

remainder = 0 

bits = (128,64,32,16,8,4,2,1) 

binary = [0,0,0,0,0,0,0,0] 

oc = int(input("Enter oc1: ")) 
if oc > 256: 
    print("Only 256 or less") 

if oc > bits[0] or oc == bits[0]: 
    binary[0] = 1 
    remainder = remainder + oc - bits[0] 
    print(binary) 
    print(remainder) 
elif oc < bits[0]: 
    binary[0] = 0 
    print(binary) 

if remainder > bits[1] or remainder == bits[1]: 
    binary[1] = 1 
    remainder = remainder - bits[1] 
    print(binary) 
    print(remainder) 
elif oc < bits[1]: 
    binary[1] = 0 
    print(binary) 

if remainder > bits[2] or oc == bits[2]: 
    binary[2] = 1 
    remainder = remainder - bits[2] 
    print(binary) 
    print(remainder) 
elif oc < bits[2]: 
    binary[2] = 0 
    print(binary) 

Когда я вхожу 128 или более, как октет, я получаю успешный выход.

Например: Ввод «192» отобразит «1,1,0,0,0,0,0,0», но все, что ниже 128, а выход - все нули.

Уверен, я мог бы использовать цикл для большей части этого, но не знаю, как это сделать.

+1

Вы смотрели на [IPAddress] (https: // docs.python.org/3/library/ipaddress.html#module-ipaddress)? –

+0

Я ничего не вижу в преобразовании ip в его двоичную форму. Просто пытаюсь создать эту программу для удобства, которое она принесет при преобразовании ip в двоичный файл @PeterWood – l30n1d45

ответ

0

Будет ли это работать на вас?

oc = int(input("Enter oc1: ")) 
if oc > 256: 
    print("Only 256 or less") 
else: 
    binary = bin(oc)[2:] 

бин() преобразует целое число в двоичный, и с помощью [2:] придаток падает ведущий «0b» в противном случае вы получите бы.

Если вы хотите, чтобы у вас было 8 символов, с ведущими нулями, вы можете использовать zfill(). В качестве другого дополнения zfill (n) будет добавлять начальные нули, пока ваша строка не будет содержать n символов.

binary = bin(oc)[2:].zfill(8) 
+0

, являющийся новым для python, этот метод заставил меня врасплох! есть ли способ сохранить самые значимые нули, видя, что при преобразовании ip в двоичный файл должно быть 8 бит? @Tom спасибо! – l30n1d45

+0

Yup, используйте zfill(). Я отредактировал свой ответ, чтобы включить его. Вероятно, вы также должны рассмотреть вопрос о включении 'if oc <0: print (« Только для негативов »)', чтобы [2:] не работал отлично. – Tom

0

Решение, данное @Tom, представляется наиболее подходящим. Но если вы хотите перейти на базовую школьную математику преобразования десятичной в двоичную, это одно из решений.

import sys 

string = "127.0.0.1" 
oc = string.split(".") 
for i in range(0, 4) : 
    num = int(oc[i]) 
    j = 0; 
    remlist = [] 
    while num > 0 : 
     rem = num % 2 
     j = j + 1 
     remlist.append(rem) 
     num = num/2 

    for x in range(j, 8) : 
     remlist.append(0)  
    for element in reversed(remlist) : 
     print element, 
    if i < 3 : 
     print ".", 
+0

петли python меня путают. Что именно означает «i» in i for i in range (0, 4): «mean? – l30n1d45

+0

петли python меня путают. Что именно делает «i» in? For i в диапазоне (0, 4): «означает? @mayankTUM – l30n1d45

+1

Функция string.split (".") анализирует строку в массив строк размера 4. Диапазон (0,4) возвращает список целых чисел [0,1,2,3] и 'i' is просто итератор, проходящий через все эти значения. Подобно «for (i = 0; i <4; i ++)» в c или java. –

0

Преобразование адреса IPv4 в двоичную:

ip=raw_input("Enter the ip address\n") #input the ipv4 address 
ips=ip.split('.') #split by '.' 

for i in ips: #ips is a list of octets, 
##we parse through the list to convert each of these to binary 
    print(format(int(i),'08b')) #Use format '08b' to add leading '0' to form '8' digits of binary 'b' 

Вход:

192.95.01.56 

Выход:

11000000 
01011111 
00000001 
00111000 
Смежные вопросы