2016-05-13 38 views
0

因此,我试图用一些二进制字符串读取文件,即: 10000010 00000000 0000 **** ********。该脚本将*的转换为0和1,所以会有两个二进制字符串是这样的:Python将二进制字符串转换为虚线格式的IP地址

10000010 00000000 00000000 00000000 10000010和00000000 00001111 11111111

脚本将它们转换为IP地址,所以在这个例子中,我的脚本应该返回130.0.0.0和130.0.15.255

这是到目前为止我的代码:

def main(): 
    text=open('filename', 'r').readlines() 
    for line in text: 
     words = line.split(" ") 
     words_2=list(words) 
     for char in words: 
      low_range=char.replace('*','0') 
      conversion=str(int(low_range, 2)) 
      decimal='.'.join(map(str,conversion)) 
      print(decimal) 
     for char in words_2: 
      high_range=char.replace('*','1') 
      conversion_2=str(int(high_range, 2)) 
      decimal='.'.join(map(str,conversion_2)) 
      print(decimal) 
main() 

当我运行我的代码,它打印出:

1.3.0 
0 
0 
0 
1.3.0 
0 
6.3 
2.5.5 
1.3.0 
0 
6.4 
0 
1.3.0 
0 
9.5 
2.5.5 
1.3.0 
0 
1.2.8 
0 
1.3.0 
0 
1.9.1 
2.5.5 
1.3.0 
0 
1.3.0 
0 
1.9.2 
0 
1.3.0 
0 
2.5.5 
2.5.5 

当我真的希望它打印出来:

130.0.0.0 
130.0.63.255 
130.0.64.0 
130.0.95.255 
130.0.128.0 
130.0.191.255 
130.0.192.0 
130.0.255.255 

任何人都可以帮助解释什么,我做错了什么?

回答

0

你是加盟字节的十进制表示的字母,而你应该加入字节本身。

decimal='.'.join(map(str,conversion)) 

另外你在自己的行打印IP的每个字节

print(decimal) 

以下是我会写循环:

for line in text: 
    words = line.split(" ") 

    for bit in '01':   
     ip = [] 
     for word in words: 
      byte=word.replace('*', bit) 
      ip.append(str(int(byte, 2))) 
     print '.'.join(ip) 
+0

非常感谢!完美的作品。假设我想在IP地址与0之间设置查找范围,并将IP地址设为1,例如在130.0.0.0-130.0.63.255之间。这会像添加一个“for i in range(ip)”循环一样简单吗? – ojbomb227

0

你可以用简单的格式:

"%d.%d.%d.%d" % (0b10000010, 0b00000000, 0b00000000, 0b00000000) 
# '130.0.0.0' 

从字符串读取的二进制数(比如"10000010")使用方法:

int("10000010", 2) 
# 130 

如果你想与我建议使用ipaddress IP地址工作:

>>> import ipaddress 
>>> ipaddress.IPv4Address("%d.%d.%d.%d" % (0b10000010, 0b00000000, 0b00000000, 0b00000000)) 
IPv4Address('130.0.0.0') 

但是,它不可用在Python 2.x中

0

您的示例将输入按空格分隔到变量words。然后你迭代单词,将它们转换为int并将其转换为字符串变量conversion。这一切都有道理。

的问题是以下行:

decimal='.'.join(map(str,conversion)) 

当获得的首次值为'130'执行。 map调用是不必要的,它只是将conversion变成字符串列表:['1', '3', '0']。然后,您将这些字符串与.一起加入,以便您在输出中看到1.3.0。请注意,即使您删除map,也会得到相同的结果,因为join只会迭代字符串中的字符。

而不是迭代字符只是将每个单词与int转换,就像你正在做的,并将它们收集到一个列表。然后将它们转换为map或列表理解的字符串,最后将它们与.一起加入。

这里有一个简单的例子,做它:

with open('test.txt') as text: 
    for line in text: 
     print '.'.join(str(int(x, 2)) for x in line.split()) 
相关问题