• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

使用Python对IP进行转换的一些操作技巧小结

python 搞代码 4年前 (2022-01-09) 25次浏览 已收录 0个评论

Python Socket模块中包含一些有用IP转换函数,说明如下:

socket.ntohl(x)     // 类似于C语言的ntohl(x)

把32位正整数从网络序转换成主机字节序。

socket.ntohs(x)    // 类似于C语言的ntohs(x)

把16位正整数从网络序转换成主机字节序。

socket.htonl(x)     // 类似于C语言的htonl(x)

把32位正整数从主机字节序转换成网络序。

socket.htons(x)    // 类似于C语言的htons(x)

把16位正整数从主机字节序转换成网络序。

socket.inet_aton(ip_string) // 依赖于inet_aton的C实现

转换IPV4地址字符串(192.168.10.8)成为32位打包的二进制格式(长度为4个字节的二进制字符串),它不支持IPV6。inet_pton()支持IPV4/IPV6地址格式。

socket.inet_ntoa(packed_ip)

转换32位打包的IPV4地址为IP地址的标准点号分隔字符串表示。

socket.inet_pton(address_family,ip_string)

转换IP地址字符串为打包二进制格式。地址家族为AF_INET和AF_INET6,它们分别表示IPV4和IPV6。

socket.inet_ntop(address_family,packed_ip)

转换一个打包IP地址为标准字符串表达式,例如:“5aef:2b::8”或“127.0.0.1”。

>>>import socket>>>import struct>>>socket.ntohl(struct.unpack("i",socket.inet_aton("10.10.58.64"))[0])168442432L>>>socket.inet_ntoa(struct.pack("i", socket.htonl(168442432L)))'10.10.58.64'>>>struct.unpack("=I", socket.inet_aton("190.10.58.64"))(1077545662,)>>>socket.inet_ntoa(struct.pack("=I", 1077545662))'190.10.58.64'# 从IP地址字符串转换为整数值defIp2Int(ip_s<mark style="color:transparent">来4源gaodaimacom搞#代%码*网</mark>tring):     return struct.unpack(“!I”,socket.inet_aton(ip))[0# 从网络字节序的数字转换为IP地址(点号分隔)def Int2Ip(ip):     return socket.inet_ntoa(struct.pack(“!I”,ip))

也可以简单地使用lambda函数来实现ip和数字的互转:
ip转数字

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

通过倒序的切割索引得出每个索引位具体的值,即j,i 的值。由于数字范围为0~255(共256个),所以再通过索引位求幂,再和本身的值求积,并求和。具体分解如下:

>>> [256**j*int(i) for j,i in enumerate(x.split('.')[::-1])][1, 0, 11010048, 3221225472]>>> for j,i in enumerate(x.split('.')[::-1]):...   print j,i...0 11 02 1683 192

数字转IP

还是上面的IP ,可以通过简单的算法将数字再转为IP,具体代码如下:

>>> num2ip = lambda x: '.'.join([str(x/(256**i)%256) for i in range(3,-1,-1)])>>> num2ip(3232235521)'192.168.0.1

上例中先得出i 的值为[3, 2 , 1 ,0 ] ,实际上这部分得出的也是索引位的值,x 就是我们上面算到的求和后的值 3232235521 。该数分数除以256的索引位次方后,得出余数为256 ,就是每个索引位的对应值 。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:使用Python对IP进行转换的一些操作技巧小结

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址