题目描述:
存在一种虚拟IPv4地址,由4小节组成,每节的范围为0-255,以#号间隔,虚拟IPv4地址可以转换为一个32位的整数,例如:128#0#255#255,转换为32位整数的结果为2147549183(0x8000FFFF)1#0#0#0,转换为32位整数的结果为16777216(0x01000000)。
现以字符串形式给出一个虚拟IPv4地址,限制第1小节的范围为1-128,即每一节范围分别为
(1-128)#(0-255)#(0-255)#(0-255)
要求每个IPv4地址只能对应到唯一的整数上。如果是非法IPv4,返回invalid IP
示例:
1#2#3
invalid 123
1#0#0#0
16777216
128#0#255#255
2147549183
解题思路:
ipv4由4小节组成,想要变成32位整数,需要每一小节为8位的二进制(这一块可以用内置函数bin来转换,但是不足8位记得补0,补0的话记得要补在前面),最后4节合并在一起,这样才能计算出32位的整数
"""
作者:长衣带风
时间:2023-6-27
ipV4地址转化为32位整数"""
def ip_32(ip_list1):
'''
返回ip对应的32位数
:param ip_list1: 列表格式,存放的是ip各个数值:['10', '0','0', '254']
:return: 32位的字符串
'''
str_b =""
for i in ip_list1:
# 转换为二进制
i1 =str(bin(int(i)))[2:]
while len(i1) <8:
i1 ='0' + i1# 也可以用zfill(8) 在左侧填充0来补全
str_b += i1
# 总共32位,开始计算
sum1 =0
for num, jin enumerate(str_b[::-1]):
if int(j) ==1:
sum1 +=2**num
return sum1
if __name__ =='__main__':
while True:
a1 =input()# 输入ipv4地址中间以 # 分割
# 确认是否是合法的ipv4
ip_list1 = a1.split("#")
judge =True
if len(ip_list1) !=4:
judge =False
else:
for num, iin enumerate(ip_list1):
if num ==0:
if (int(i) >=1) & (int(i) <=128):
pass
else:
judge =False
break
else:
if (int(i) >=0) & (int(i) <=255):
pass
else:
judge =False
break
if judge ==False:
# 直接输出不合规的ip
print(f"invalid {a1.replace('#','.')}")
else:
# 正常的ip
ip_num = ip_32(ip_list1)
print(ip_num)
效果展示: