Python将二进制字符串转换为虚线格式的IP地址
因此,我试图用一些二进制字符串读取文件,即: 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
任何人都可以帮助解释什么,我做错了什么?
你是加盟字节的十进制表示的字母,而你应该加入字节本身。
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)
你可以用简单的格式:
"%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中
您的示例将输入按空格分隔到变量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())
非常感谢!完美的作品。假设我想在IP地址与0之间设置查找范围,并将IP地址设为1,例如在130.0.0.0-130.0.63.255之间。这会像添加一个“for i in range(ip)”循环一样简单吗? – ojbomb227