HJ33 整数与IP地址间的转换
描述
原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成
一个长整数。
举例:一个ip地址为10.0.3.193
每段数字 相对应的二进制数
10 00001010
0 00000000
3 00000011
193 11000001
组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。
数据范围:保证输入的是合法的 IP 序列
输入描述:
输入
1 输入IP地址
2 输入10进制型的IP地址
输出描述:
输出
1 输出转换成10进制的IP地址
2 输出转换后的IP地址
示例1
输入:
10.0.3.193 167969729
输出:
167773121 10.3.3.193
新一轮屎山
import sys
a=input().split(".")
b=int(input())
m_b=''
for i in a:
m_bin = bin(int(i))
m_bi = m_bin[2::]
if len(m_bi)< 9:
m_bi = '0'*(8-len(m_bi)) + m_bi
m_b = m_b + m_bi
print(int(m_b,base=2))
b_bin = bin(b)
b_bi = b_bin[2::]
if len(b_bi)<33:
b_b = '0'*(32-len(b_bi))+ b_bi
m = [b_b[i:i+8] for i in range(0, 32, 8)]
new_x=''
for item in m:
x = int(item,base=2)
new_x += str(x)+"."
print(new_x[:-1])
进制转换:python 中进制转换
简洁写法:
str1 = input() # 获取用户输入的字符串,假设是IPv4地址格式(例如"192.168.0.1")
str2 = int(input()) # 获取用户输入的整数
def encode(s: str):
result_str = '' # 初始化一个空字符串,用于存储二进制表示
for char in s.split('.'): # 将输入字符串按"."分割成列表,并遍历每个元素
result_str += bin(int(char))[2:].zfill(8) # 将每个元素转换为二进制字符串,去掉"0b"前缀,补齐到8位并追加到result_str中
return int(result_str, 2) # 将拼接后的二进制字符串转换为十进制整数并返回
def decode(s: int):
tmp = bin(s)[2:] # 将输入的整数转换为二进制字符串,去掉"0b"前缀
tmp = tmp.zfill(32) # 补齐到32位
target = '' # 初始化一个空字符串,用于存储解码后的IPv4地址
for i in range(0, 32, 8): # 每8位为一组,遍历32位二进制字符串
target += str(int(tmp[i:i+8], 2)) # 将每8位二进制字符串转换为十进制整数,并追加到target中
target += '.' # 在每个整数后追加一个"."
return target[:-1] # 去掉最后一个"."并返回解码后的IPv4地址
print(encode(str1)) # 调用encode函数并打印结果
print(decode(str2)) # 调用decode函数并打印结果
zfill函数
①语法说明:
str.zfill(width)
其中,str表示这里要对一个字符串类型string进行操作,如果是整型、浮点型这样的数字类型,要先通过str()函数转化为字符串,才可以进行相关的操作;
width表示进行补零之后的字符串的长度,如果补零后的长度小于或等于原字符串的长度,那么字符串将不会产生任何的变化。
注意输出形式,尤其是IP地址末尾的 . 需要删去。
import sys
import re
def IP2Ten(s):
res=''.join([bin(int(x))[2:].rjust(8,'0') for x in s.split('.')])
print(int(res,2))
def Ten2IP(s):
res= bin(int(s))[2:].rjust(32,'0')
print('.'.join([str(int(res[i*8:i*8+8],2)) for i in range(4)]))
for line in sys.stdin:
if re.search('\.',line):
IP2Ten(line)
else:
Ten2IP(line)
rjust() 返回一个原字符串右对齐,并使用指定字符填充至指定长度的新字符串,默认的填充字符为空格。如果指定的长度小于原字符串的长度则返回原字符串。
语法
rjust()方法语法:
str.rjust(width[, fillchar])
参数
-
width -- 指定填充指定字符后中字符串的总长度.
-
fillchar -- 填充的字符,默认为空格。
返回值
返回一个原字符串右对齐,并使用空格填充至长度 width 的新字符串。如果指定的长度小于字符串的长度则返回原字符串。