There is an ongoing outage on the primary CPAN mirror. It is possible to work around the issue by using MetaCPAN as a mirror.

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 转换

getIpMaskFromRange($min, $max)

将整数范围转换为 CIDR 表示形式(如果能整齐表示),否则返回 IP 范围格式 (ip1-ip2)。

服务端口处理

getRangeFromService($service)

根据服务字符串获取协议和端口范围。

输入格式:协议/端口,例如:

  • tcp/80 → TCP 协议 80 端口

  • udp/53 → UDP 协议 53 端口

  • icmp/0 → ICMP 协议

  • any0 → 任意协议与端口

  • 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.