Python将二进制字符串转换为虚线表示法中的IP地址

时间:2016-05-13 00:38:23

标签: python networking binary ip

所以我试图用一些二进制字符串读取一个文件,即: 10000010 00000000 0000 **** ********。该脚本将*转换为0和1,因此将有两个二进制字符串,如下所示:

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  

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

3 个答案:

答案 0 :(得分:0)

您可以使用简单的格式:

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

要从字符串中读取二进制数(例如"10000010"),请使用:

int("10000010", 2)
# 130

如果你想使用ip地址我建议使用ipaddress

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

但是,它在python 2.x

下不可用

答案 1 :(得分: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())

答案 2 :(得分: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)