python3实现网络字节序和ipv4、ipv6互转[通俗易懂]

文章目录1.前言2.什么是是网络字节序3.ipv4和ipv6简介4.转换5.参考文献1.前言2.什么是是网络字节序3.ipv4和ipv6简介4.转换5.参考文献[1][2]

大家好,又见面了,我是你们的朋友全栈君。

1. 前言

项目中涉及到了ip和网络自己序的相互转换,写此博客用以记录转换的方法。

2. 什么是是网络字节序?

网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian(大端)排序方式。

本节来自 大小端及网络字节序

网络上传输的数据都是字节流,对于一个多字节数值,在进行网络传输的时候,先传递哪个字节?也就是说,当接收端收到第一个字节的时候,它将这个字节作为高位字节还是低位字节处理,是一个比较有意义的问题。

UDP/TCP/IP协议规定:

把接收到的第一个字节当作高位字节看待,这就要求发送端发送的第一个字节是高位字节;
而在发送端发送数据时,发送的第一个字节是该数值在内存中的起始地址处对应的那个字节,也就是说,该数值在内存中的起始地址处对应的那个字节就是要发送的第一个高位字节(即:高位字节存放在低地址处);
由此可见,多字节数值在发送之前,在内存中因该是以大端法存放的。

3. ipv4和ipv6简介

详情请看 IPV4与IPV6的区别(史上最详细)

IPv6与IPv4的区别主要有以下几点:

  1. IPv6的地址空间更大。IPv4中规定IP地址长度为32位(4个字节),即有232– 1个地址;而IPv6中IP地址的长度为128位(16个字节),即有2128 – 1个地址。夸张点说就是,如果IPV6被广泛应用以后,全世界的每一粒沙子都会有相对应的一个IP地址。
  2. IPv6的路由表更小。IPv6的地址分配一开始就遵循聚类(Aggregation)的原则,这使得路由器能在路由表中用一条记录(Entry)表示一片子网,大大减小了路由器中路由表的长度,提高了路由器转发数据包的速度。
  3. IPv6的组播支持以及对流的支持增强。这使得网络上的多媒体应用有了长足发展的机会,为服务质量控制提供了良好的网络平台。
  4. IPv6加入了对自动配置的支持。这是对DHCP协议的改进和扩展,使得网络(尤其是局域网)的管理更加方便和快捷。
  5. IPv6具有更高的安全性。在使用IPv6网络中,用户可以对网络层的数据进行加密并对IP报文进行校验,这极大地增强了网络安全。

4. 转换

本节来自 python将ipv6转换为整数

通过使用python自带的官方库和某些第三方库都可以实现 ip 和网络字节序之间的相互转换,目前了解到的由如下4中方法。

4.1 ipaddress

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'

4.2 socket 和 struct

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,)

4.3 IPy

安装第三方库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'

4.4 netaddr

安装第三方库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

5. 参考文献

[1] 大小端及网络字节序
[2] python将ipv6转换为整数
[3] python 官方文档 socket
[4] IPV4与IPV6的区别(史上最详细)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/128320.html原文链接:https://javaforall.net

(0)
上一篇 2022年4月11日 下午5:00
下一篇 2022年4月11日 下午5:20


相关推荐

  • Qt QListWidget详解

    Qt QListWidget详解1.QListWidget和QListViewQListWidget是继承QListView,QListView是基于Model的,需要自己来建模(如建立QStringListModel,QSqlTableModel等),保存数据,这样就大大降低了数据冗余,提高了程序的效率,但是需要我们对数据建模有一定的了解,而QListWidget是一个升级版本的QListView,它已经为我们建立了一个数据存储模型QListWidgetItem,操作方便,直接调用addItem即可添加Item项。2….

    2022年6月6日
    112
  • ensp服务器配置文件,ensp配置web服务器

    ensp服务器配置文件,ensp配置web服务器ensp 配置 web 服务器内容精选换一换该任务指导用户使用 Loader 将数据从 HBase 导出到 SFTP 服务器 创建或获取该任务中创建 Loader 作业的业务用户和密码 确保用户已授权访问作业执行时操作的 HBase 表或 phoenix 表 获取 SFTP 服务器使用的用户和密码 且该用户具备 SFTP 服务器数据导出目录的写入权限 检查磁盘空间 确保没有出现告警且余量满足导入 导出数据的大小 该任务指导用户使用 L

    2026年3月17日
    3
  • android控件大全及用法_学双人舞一步一步教学

    android控件大全及用法_学双人舞一步一步教学GridView用于显示二维滚动网格的View。同ListView一样,他的数据项也是从ListAdapter中产生。关于他的使用方法可参见官网的示例GridView 。下面先了解下GridView中常用到的属性:1、android:numColumn:指定GridView的列数,如果指定为auto_fit,则可能根据控件的大小自动调整每行显示的列数。2、android:st

    2025年5月22日
    4
  • 用户体验–NPS&满意度指标[通俗易懂]

    用户体验–NPS&满意度指标[通俗易懂]一、NPS1.什么是NPS值?NPS值(NetPromoterScore,净推荐值)是度量“客户向他人推荐某品牌/产品/服务倾向”的指标,是当前国际通用的衡量客户行为忠诚的核心指标,本质上是一种客户口碑及行为忠诚2.为什么要持续监控NPS?通过教育行业调研发现,口碑推荐是用户愿意体验尝试产品的最主要、也是最为信任的渠道,同时也是在促进用户购买决策中起到至关重要的作用,因此要持续监控NPS指标,营造口碑效应3.NPS得分如何获取?目前业务NPS均通过产品化手段实现NPS调研问卷的回收,.

    2022年5月27日
    59
  • 我的大学生活

    我的大学生活

    2021年8月10日
    68
  • js es6转es5在线_es6 array

    js es6转es5在线_es6 arrayes6尚未得到所有浏览器的全部支持将es6转化为es5必要。下面将利用babel转换js语法首先安装npminstall–save-dev@babel/core@babel/cli@babel/preset-env@babel/node在项目中创建babel.config.js文件(不可更改)在文件中写入如下代码constpresets=[ [“@babel/env”,{ targets:{ ie:”8″, edge:”17″, firef

    2026年3月7日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号