大家好,又见面了,我是你们的朋友全栈君。
项目中涉及到了ip和网络自己序的相互转换,写此博客用以记录转换的方法。
网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian(大端)排序方式。
本节来自 大小端及网络字节序
网络上传输的数据都是字节流,对于一个多字节数值,在进行网络传输的时候,先传递哪个字节?也就是说,当接收端收到第一个字节的时候,它将这个字节作为高位字节还是低位字节处理,是一个比较有意义的问题。
UDP/TCP/IP协议规定:
把接收到的第一个字节当作高位字节看待,这就要求发送端发送的第一个字节是高位字节; 而在发送端发送数据时,发送的第一个字节是该数值在内存中的起始地址处对应的那个字节,也就是说,该数值在内存中的起始地址处对应的那个字节就是要发送的第一个高位字节(即:高位字节存放在低地址处); 由此可见,多字节数值在发送之前,在内存中因该是以大端法存放的。
详情请看 IPV4与IPV6的区别(史上最详细)
IPv6与IPv4的区别主要有以下几点:
本节来自 python将ipv6转换为整数
通过使用python自带的官方库和某些第三方库都可以实现 ip 和网络字节序之间的相互转换,目前了解到的由如下4中方法。
import ipaddress
ip4 = '102.103.104.105'
net4 = 1718052969
ip6 = '2001:0db8:3c4d:0015:0000:0000:1a2f:1a2b'
net6 = 42540766429944781121676641069932943915
int(ipaddress.ip_address(ip4)) # 1718052969
int(ipaddress.ip_address(ip6)) # 42540766429944781121676641069932943915
str(ipaddress.ip_address(net4)) # '102.103.104.105'
str(ipaddress.ip_address(net6)) # '2001:0db8:3c4d:0015:0000:0000:1a2f:1a2b'
import socket
import struct
ip4 = '102.103.104.105'
net4 = 1718052969
ip6 = '2001:0db8:3c4d:0015:0000:0000:1a2f:1a2b'
net6 = 42540766429944781121676641069932943915
socket.inet_pton(socket.AF_INET, ip4)
socket.inet_pton(socket.AF_INET6, ip6)
socket.inet_ntop(socket.AF_INET, net4)
socket.inet_ntop(socket.AF_INET, net6)
# 如果只需要ipv4和网络字节序的互转,也可使用inet_ntoa()方法
socket.inet_ntoa(struct.pack("!I", net4)) # '102.103.104.105'
struct.unpack("!I", socket.inet_aton(ip4)) # (1718052969,)
安装第三方库IPy
pip install IPy
import IPy
IPy.IP(ip4).int() # 1718052969
ip4 = '102.103.104.105'
net4 = 1718052969
ip6 = '2001:0db8:3c4d:0015:0000:0000:1a2f:1a2b'
net6 = 42540766429944781121676641069932943915
IPy.IP(ip4).int() # 1718052969
IPy.IP(ip6).int() # 42540766429944781121676641069932943915
IPy.IP(net4).strCompressed() # '102.103.104.105'
IPy.IP(net6).strCompressed() # '2001:db8:3c4d:15::1a2f:1a2b'
安装第三方库netaddr
pip install netaddr
目前我使用netaddr只能ip地址->网络字节序的单项转换。
from netaddr import *
ip4 = '102.103.104.105'
net4 = 1718052969
ip6 = '2001:0db8:3c4d:0015:0000:0000:1a2f:1a2b'
net6 = 42540766429944781121676641069932943915
IPNetwork(ip4).ipv4().value # 1718052969
IPNetwork(ip4).ipv6().value # 281472399796329
IPNetwork(ip6).ipv4().value # 报错
IPNetwork(ip6).ipv6().value # 42540766429944781121676641069932943915
[1] 大小端及网络字节序 [2] python将ipv6转换为整数 [3] python 官方文档 socket [4] IPV4与IPV6的区别(史上最详细)
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/128320.html原文链接:https://javaforall.cn