2013-11-02 188 views
0

我需要一个将用户输入的IPv4地址转换为二进制和基地址10的程序。事情是这样的:将点十进制IP地址转换为二进制(Python)

input: 142.55.33.1 
output (base 10): [2385977601] 
output (base 2): [10001110 00110111 00100001 00000001] 

到目前为止,我已经成功地将其转换成一个base10地址,但我似乎无法得到解决的基础问题2:

#!/usr/bin/python3 

ip_address = input("Please enter a dot decimal IP Address: ") 

#splits the user entered IP address on the dot 
ListA = ip_address.split(".") 
ListA = list(map(int, ListA)) 

ListA = ListA[0]*(256**3) + ListA[1]*(256**2) + ListA[2]*(256**1) + ListA[3] 
print("The IP Address in base 10 is: " , ListA) 

#attempt at binary conversion (failing) 
#ListA = ListA[0]*(2**3) + ListA[1]*(2**2) + ListA[2]*(2**1) + ListA[3] 
#print("The IP Address in base 2 is: " , ListA) 

任何帮助将不胜感激。谢谢。

回答

4

使用format

>>> text = '142.55.33.1' 
>>> ' ' .join(format(int(x), '08b') for x in text.split('.')) 
'10001110 00110111 00100001 00000001' 

在情况下,如果你想有一个清单:

>>> [format(int(x), '08b') for x in text.split('.')] 
['10001110', '00110111', '00100001', '00000001'] 

这里的格式转换成其二进制字符串表示的整数:

>>> format(8, 'b') 
'1000' 
>>> format(8, '08b') #with padding 
'00001000' 
+0

非常感谢!这非常有帮助! – user1819786

1

使用str.format

>>> ip_address = '142.55.33.1' 
>>> ['{:08b}'.format(int(n)) for n in ip_address.split('.')] 
['10001110', '00110111', '00100001', '00000001'] 
>>> ' '.join('{:08b}'.format(int(n)) for n in ip_address.split('.')) 
'10001110 00110111 00100001 00000001' 
+0

['{:08b}'.format(int(n))for ip_address.split('。')] < - 你能解释一下这里发生了什么吗? – user1819786

+0

@ user1819786,'[... for item in seq]'被称为[** list comprehension **](http://docs.python.org/2/tutorial/datastructures.html#list-comprehensions)。 – falsetru

+0

'str.format'用于对数字进行二进制表示。例如'':{:08b}'。format(3)'产生'00000011'。请参阅[格式字符串语法](http://docs.python.org/2/library/string.html#formatstrings)。 – falsetru

相关问题