所以我试图用一些二进制字符串读取一个文件,即: 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
任何人都可以帮忙解释我做错了什么吗?
答案 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)