当前位置: 首页 > article >正文

Python 语言实现 IP 地址转换

以下是使用 Python 语言实现 IP 地址转换相关功能的资源示例,包含了 IP 地址十进制与二进制相互转换以及 IP 地址整数表示与点分十进制表示相互转换的代码及解释

IP 地址十进制与二进制相互转换

十进制 IP 转二进制 IP

在 Python 中,我们可以利用ipaddress模块以及字符串操作等方式来实现将常见的点分十进制表示的 IP 地址转换为二进制形式。以下是示例代码:

import ipaddress

def decimal_ip_to_binary(ip_str):
    ip = ipaddress.ip_address(ip_str)
    packed_ip = ip.packed
    binary_ip = '.'.join([bin(int(x))[2:].zfill(8) for x in packed_ip])
    return binary_ip

# 示例用法
ip_address = "192.168.1.1"
print(decimal_ip_to_binary(ip_address))

代码解释:

  1. 首先导入了ipaddress模块,它提供了处理 IP 地址的一些实用功能。
  2. 定义了decimal_ip_to_binary函数,接受一个表示 IP 地址的字符串参数ip_str
  3. 通过ipaddress.ip_address将输入的字符串形式 IP 地址转换为IPv4AddressIPv6Address对象(这里以 IPv4 为例),然后利用packed属性获取其字节形式的表示(对于 IPv4 是 4 个字节)。
  4. 接着使用列表推导式遍历每个字节,将其转换为二进制字符串(通过bin函数,去掉开头的0b后用zfill函数填充为 8 位),再用'.'连接起来,最终得到二进制形式的 IP 地址并返回。
二进制 IP 转十进制 IP

反过来,将二进制形式的 IP 地址转换回十进制(点分十进制形式)的代码如下:

import ipaddress

def binary_ip_to_decimal(binary_ip_str):
    binary_parts = binary_ip_str.split('.')
    decimal_parts = [str(int(x, 2)) for x in binary_parts]
    decimal_ip = '.'.join(decimal_parts)
    try:
        ipaddress.ip_address(decimal_ip)
        return decimal_ip
    except ValueError:
        return "Invalid IP format"
# 示例用法
binary_ip = "11000000.10101000.00000001.00000001"
print(binary_ip_to_decimal(binary_ip))

代码解释:

  1. 同样先导入ipaddress模块。
  2. 定义binary_ip_to_decimal函数,接收二进制形式 IP 地址的字符串binary_ip_str
  3. 先将二进制 IP 地址按.分割为各个部分,然后通过列表推导式将每个二进制部分转换为十进制(利用int函数并指定进制为 2),再用'.'连接起来得到点分十进制形式的字符串表示。
  4. 最后利用ipaddress.ip_address尝试构造 IP 地址对象来验证格式是否正确,如果正确则返回转换后的十进制 IP 地址,否则返回提示信息表示格式无效。

IP 地址整数表示与点分十进制表示相互转换

点分十进制 IP 转整数表示

我们可以把 IP 地址看成是由 4 个字节组成,每个字节的值范围是 0 - 255,将其转换为一个整数,可以通过位运算等方式来实现,以下是代码示例:

def decimal_ip_to_integer(ip_str):
    parts = ip_str.split('.')
    integer_ip = 0
    for i in range(4):
        integer_ip += int(parts[i]) << (8 * (3 - i))
    return integer_ip

# 示例用法
ip = "192.168.1.1"
print(decimal_ip_to_integer(ip))

代码解释:

  1. 定义decimal_ip_to_integer函数,接收点分十进制 IP 地址字符串ip_str
  2. 先将 IP 地址按.分割为 4 个部分存到列表parts中。
  3. 然后通过循环,将每个部分对应的字节值(转换为整数后)左移相应的位数(根据字节在 IP 地址中的位置,从左到右依次左移 24 位、16 位、8 位、0 位),并累加到integer_ip变量中,最终得到表示该 IP 地址的整数并返回。
整数表示 IP 转点分十进制 IP

将整数表示的 IP 地址转换回点分十进制形式的代码如下:

def integer_ip_to_decimal(integer_ip):
    part1 = (integer_ip >> 24) & 0xFF
    part2 = (integer_ip >> 16) & 0xFF
    part3 = (integer_ip >> 8) & 0xFF
    part4 = integer_ip & 0xFF
    return f"{part1}.{part2}.{part3}.{part4}"

# 示例用法
ip_integer = 3232235777  # 对应192.168.1.1的整数表示
print(integer_ip_to_decimal(ip_integer))

代码解释:

  1. 定义integer_ip_to_decimal函数,接收表示 IP 地址的整数integer_ip
  2. 通过右移操作(>>)以及按位与操作(&)依次提取出 4 个字节对应的值,比如先右移 24 位并与0xFF(255 的十六进制表示,用于获取最低 8 位也就是一个字节的值)按位与得到第一个字节的值,以此类推得到其他字节的值。
  3. 最后将这 4 个字节的值用.连接起来组成点分十进制形式的 IP 地址并返回。


http://www.kler.cn/a/463736.html

相关文章:

  • 5大常见高并发限流算法选型浅析
  • 音频进阶学习九——离散时间傅里叶变换DTFT
  • AMP 混合精度训练中的动态缩放机制: grad_scaler.py函数解析( torch._amp_update_scale_)
  • xdoj ROT13加密
  • 在Typora中实现自动编号
  • uniapp 自定义类微信支付键盘 (微信小程序)
  • Linux Kernel Programming4
  • linux-24 文件管理(二)文件编辑,字符集,nano,文件删除,rm
  • 【Web安全】文件写入漏洞 ASP 网页病毒模拟(文件写入漏洞+FilesystemObject)
  • STM32单片机芯片与内部52 I2C 数据手册 寄存器
  • Prometheus 采集 JVM 数据
  • 从0到机器视觉工程师(二):封装调用静态库和动态库
  • 重启ubuntu服务器,如何让springboot服务自动运行
  • 【SQL Server】教材数据库(1)
  • Javascript数据结构常见题目(一)
  • Harmony OS 开发-ArkUI框架速成一
  • 【深度学习】多目标融合算法—样本Loss提权
  • 2024 年发布的 Android AI 手机都有什么功能?
  • springboot529基于JavaWeb的本科生交流培养管理平台的设计与实现(论文+源码)_kaic
  • C++:Windows 多线程 简单示例
  • Ubuntu 24.04安装和使用WPS 2019
  • 2412d,d语言中写汇编
  • 机器学习 LightGBM 算法原理解析
  • QT---------GUI程序设计基础
  • Linux下Shell编程之sed命令详解及示例
  • C#语言的字符串处理