PDK::Utils::Ip - IP 地址与掩码转换及范围操作工具类
SYNOPSIS
use PDK::Utils::Ip;
my $ipUtil = PDK::Utils::Ip->new;
# IP 转整数
my $num = $ipUtil->changeIpToInt("192.168.1.1");
say $num; # 3232235777
# 整数转 IP
say $ipUtil->changeIntToIp($num); # 192.168.1.1
# 获取 IP 范围
my ($min, $max) = $ipUtil->getRangeFromIpMask("192.168.1.0", "24");
# 获取网络地址
say $ipUtil->getNetIpFromIpMask("192.168.1.10", "255.255.255.0"); # 192.168.1.0
# 服务端口范围
my ($smin, $smax) = $ipUtil->getRangeFromService("tcp/80");
DESCRIPTION
该模块提供了一系列与 IP 地址、掩码、端口及服务相关的工具方法,支持 IP 与整数的互转、CIDR/掩码处理、范围计算、以及服务端口解析。
METHODS
IP 范围处理
- getRangeFromIpRange($ipMin, $ipMax)
-
从两个 IP 地址范围 (点分十进制) 获取对应的整数范围。
在列表上下文中返回 (MIN, MAX),在标量上下文中返回一个 PDK::Utils::Set 对象。
- getRangeFromIpMask($ip, $mask)
-
根据 IP 和掩码计算整数范围。
支持以下几种输入:
CIDR 格式,例如:
192.168.1.1/24
掩码格式,例如:
192.168.1.1 255.255.255.0
IP 范围格式,例如:
192.168.1.1-192.168.1.10
返回网络范围的最小值与最大值(列表上下文返回区间,标量上下文返回 Set 对象)。
- getNetIpFromIpMask($ip, $mask)
-
根据 IP 和掩码获取网络地址。
IP 与整数互转
- changeIntToIp($num)
-
将整数转换为 IP 地址 (点分十进制)。
- changeIpToInt($ip)
-
将 IP 地址 (点分十进制) 转换为整数。
支持特殊值
any
,转换为0.0.0.0
。
掩码转换
- changeMaskToNumForm($mask)
-
将掩码转换为数字形式(0–32)。
支持两种输入:
点分十进制格式 (如 255.255.255.0)
数字格式 (如 24)
- changeWildcardToMaskForm($wildcard)
-
将反掩码(Wildcard Mask)转换为普通掩码。
例如:
0.0.0.255
转换为255.255.255.0
。 - changeMaskToIpForm($mask)
-
将掩码转换为点分十进制格式。
支持输入数字形式 (0–32),或已是点分格式。
IP 范围与 CIDR 转换
服务端口处理
- getRangeFromService($service)
-
根据服务字符串获取协议和端口范围。
输入格式:
协议/端口
,例如:tcp/80
→ TCP 协议 80 端口udp/53
→ UDP 协议 53 端口icmp/0
→ ICMP 协议any
或0
→ 任意协议与端口tcp/20-21
→ TCP 协议 20–21 端口
返回值为协议号左移 16 位 + 端口号。 在列表上下文返回 (MIN, MAX),在标量上下文返回 PDK::Utils::Set 对象。
ERROR HANDLING
IP 格式不正确时抛出异常。
掩码格式或范围非法时抛出异常。
服务字符串不符合格式时可能返回默认范围或异常。
EXAMPLES
use PDK::Utils::Ip;
my $ipUtil = PDK::Utils::Ip->new;
# IP 转整数
my $num = $ipUtil->changeIpToInt("192.168.1.1");
say $num; # 3232235777
# 整数转 IP
say $ipUtil->changeIntToIp($num); # 192.168.1.1
# 获取 IP 范围
my ($min, $max) = $ipUtil->getRangeFromIpMask("192.168.1.0", "24");
# 获取网络地址
say $ipUtil->getNetIpFromIpMask("192.168.1.10", "255.255.255.0"); # 192.168.1.0
# 服务端口范围
my ($smin, $smax) = $ipUtil->getRangeFromService("tcp/80");
AUTHOR
WENWU YAN <968828@gmail.com>
LICENSE AND COPYRIGHT
This software is licensed under the same terms as Perl itself.