【每日一题20220805】整型数字转IPv4

:mage:‍ 获取以下 IPv4 地址:128.32.10.1

该地址有 4 个八位字节,其中每个八位字节是一个字节(或 8 位)。

  • 第一个八位字节128 具有二进制表示:10000000
  • 第二个八位字节32 具有二进制表示:00100000
  • 第三个八位字节10 具有二进制表示:00001010
  • 第 4 个八位字节1 具有二进制表示:00000001

所以128.32.10.1 ==10000000.00100000.00001010.00000001

因为上面的 IP 地址有 32 位,我们可以将其表示为无符号的 32 位数字(即把上述的二进制中的.都去掉后整个二进制转换成整型):2149583361

完成接受无符号 32 位数字并返回其 IPv4 地址的字符串表示形式的函数。

例子

2149583361 ==> "128.32.10.1"
32         ==> "0.0.0.32"
0          ==> "0.0.0.0"

题目难度:简单
题目来源:https://www.codewars.com/kata/52e88b39ffb6ac53a400022e

注:
使用 ipaddress 库是作弊的行为

from typing import Union

def int32_to_ip(int32: int) -> Union[str, bool]:
    # your code here
    return 

assert int32_to_ip(2154959208) == 128.114.17.104" 
assert int32_to_ip(0) == "0.0.0.0"
assert int32_to_ip(2149583361) == "128.32.10.1"
assert int32_to_ip(4095833611) == "244.33.118.11"
assert int32_to_ip(4294967296) == False
def int32_to_ip(int32):
    # your code here
    s="{:032d}".format(int(bin(int32).replace("0b","")))
    return False if len(s)>32  else ".".join([str(int(s[i:i+8],2)) for i in range(0,32,8)])

def int32_to_ip(int32: int) -> Union[str, bool]:
    base_num = "{0:b}".format(int32)
    base_num_32="{0:032b}".format(int32)
    return False if len(base_num)>32 else '.'.join(str(int(base_num_32[(32//4)*i-8:(32//4)*i],2)) for i in range(1,5))
def int32_to_ip(int32: int) -> Union[str, bool]:
    int1=str(bin(int32)[2:])
    if len(int1)<=32:
        int1='0'*(32-len(int1))+int1
    else:
        return False
    int1_list=[int1[8*i:8*(i+1)] for i in range(round(len(int1)/8))]
    return '.'.join([str(int(str(int1_list[i]),2)) for i in range(len(int1_list))])

assert int32_to_ip(2154959208) == "128.114.17.104"
assert int32_to_ip(0) == "0.0.0.0"
assert int32_to_ip(2149583361) == "128.32.10.1"
assert int32_to_ip(4095833611) == "244.33.118.11"
assert int32_to_ip(4294967296) == False