关于Python中IPv4地址转换为长整型的操作

        最近一段时间在公司忙活着将最新项目的接口进行自动化,在项目中的某个版块中涉及IP地址。然后就涉及生成随机且正确的IPv4地址,当然这个是非常容易生成的:

# 这里将_这个占位符来做一个临时变量,Python里可以用它来作为变量,因为后续传值一般不会用到,所以可以只用了来实现循环的次数
IP1 = ".".join(map(str, (random.randint(18, 72) for _ in range(4))))

       改行代码运行后的结果:

        通过使用random中的随机整数方法randint生成在一定范围里的正整数,然后通过生成器表达式来生成四个这样的随机整数(因为用.组成的IP地址,要用map对各个整数改变类型为str,不然会报错)

        但是在项目中开发人员对IP地址入库时,做出了一个处理:将IPv4地址转换为长整型(long),这就让接口自动化断言的时候对比接口返回值与数据库中的值的时候多了一个步骤,那就是把接口入参的IP地址转为长整型,或者将入库的long类型数据转化为IPv4地址。(这里我选择将接口入参IPv4地址转换为长整型)

        作为一个新人小白,我还不知道python里有没有对应的方法进行转换。然后我就百度查询对应的转换公式:IP=((a*256+b)*256+c)*256+d(其中a,b,c,d依次对应IPv4地址中四个分段的数字)。例:ip=56.49.27.66                  a=56;b=49;c=27;d=66

        我们将公式化简:IP=256^3*a+256^2*b+256*c+d。这个时候我们就可以直接用for循环来进行处理了:

i = 0
sum = 0
# 这里我们将IPv4地址通过.分割然后倒序一下
ip1 = ip1.split('.')[::-1]
# 通过循环遍历进行计算乘方,根据公式得计算方程:256*遍历次数*该次遍历的数字,然后求和
for j in range(len(ip1)):
    sum = sum + 256 ** int(j) * int(ip1[i])
    i = i + 1
print(sum)

        当然我们还可以进一步将代码处理,通过enumerate这个Python的内置函数,来取到索引以及值。

ip1 = '1.1.1.1'
print(enumerate(ip1.split('.')[::-1]))
for i, j in enumerate(ip1.split('.')[::-1]):
    print(i, j)

      这个时候就可以将方法简化了一下:

sum = 0
for i, j in enumerate(ip1.split('.')[::-1]):
    sum = sum + 256**i*int(j)
print('IPv4地址转换为长整型:%s' % sum)

        随后,我就想到用lambda匿名函数来处理可以更加简洁,将上述逻辑简化为lambda匿名函数:

IP = lambda x: sum([256 ** i * int(j) for i, j in enumerate(x.split('.')[::-1])])

        最后直接通过匿名函数可以将这个转换过程简化为一行代码,真的是太优雅了!!!!

        最终的效果:

         写这个小文章纯属只是纪念一下自己的学习过程,文章中可能有很多不专业的语句,还请各位大佬勿喷 [狗头保命][狗头保命][狗头保命]

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值