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))
代码解释:
- 首先导入了
ipaddress
模块,它提供了处理 IP 地址的一些实用功能。 - 定义了
decimal_ip_to_binary
函数,接受一个表示 IP 地址的字符串参数ip_str
。 - 通过
ipaddress.ip_address
将输入的字符串形式 IP 地址转换为IPv4Address
或IPv6Address
对象(这里以 IPv4 为例),然后利用packed
属性获取其字节形式的表示(对于 IPv4 是 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))
代码解释:
- 同样先导入
ipaddress
模块。 - 定义
binary_ip_to_decimal
函数,接收二进制形式 IP 地址的字符串binary_ip_str
。 - 先将二进制 IP 地址按
.
分割为各个部分,然后通过列表推导式将每个二进制部分转换为十进制(利用int
函数并指定进制为 2),再用'.'
连接起来得到点分十进制形式的字符串表示。 - 最后利用
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))
代码解释:
- 定义
decimal_ip_to_integer
函数,接收点分十进制 IP 地址字符串ip_str
。 - 先将 IP 地址按
.
分割为 4 个部分存到列表parts
中。 - 然后通过循环,将每个部分对应的字节值(转换为整数后)左移相应的位数(根据字节在 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))
代码解释:
- 定义
integer_ip_to_decimal
函数,接收表示 IP 地址的整数integer_ip
。 - 通过右移操作(
>>
)以及按位与操作(&
)依次提取出 4 个字节对应的值,比如先右移 24 位并与0xFF
(255 的十六进制表示,用于获取最低 8 位也就是一个字节的值)按位与得到第一个字节的值,以此类推得到其他字节的值。 - 最后将这 4 个字节的值用
.
连接起来组成点分十进制形式的 IP 地址并返回。