在 Perl 中向二进制字符串添加 1 的最简单方法是什么?

What's the simplest way of adding one to a binary string in Perl?

我有一个变量,它包含一个 4 字节的网络顺序 IPv4 地址(这是使用 pack 和整数表示创建的)。我有另一个变量,也是一个 4 字节的网络顺序子网。我正在尝试将它们加在一起并添加一个以获得子网中的第一个 IP。

为了得到ASCII表示,我可以做inet_ntoa($ip&$netmask)来得到基地址,但是做inet_ntoa((($ip&$netmask)+1)是错误的;我收到如下消息:

1
2
3
 Argument"\
\
&\\0"
isn't numeric in addition (+) at test.pm line 95.

那么发生了什么,据我所知,最好的是,它正在查看 4 个字节,发现 4 个字节不代表数字字符串,然后拒绝加 1。

另一种说法:我想要它做的是在最低有效字节上加1,我知道这是第4个字节?也就是说,我想获取字符串 \
\
&\\0
并以字符串 \
\
&\\1
结尾。最简单的方法是什么?

有没有办法做到这一点,而不必解包和重新打包变量?


发生的事情是你用 $ip&$netmask 创建一个字节串,然后尝试把它当作一个数字来对待。像这样的,这是行不通的。你必须提供给 inet_ntoa 的是。

1
pack("N", unpack("N", $ip&$netmask) + 1)

我认为没有更简单的方法。


混淆整数和字符串。也许下面的代码会有所帮助:

1
2
3
4
5
6
7
8
9
10
11
use Socket;

$ip = pack("C4", 192,168,250,66); # why not inet_aton("192.168.250.66")
$netmask = pack("C4", 255,255,255,0);

$ipi = unpack("N", $ip);
$netmaski = unpack("N", $netmask);

$ip1 = pack("N", ($ipi&$netmaski)+1);
print inet_ntoa($ip1),"\
"
;

哪些输出:

1
192.168.250.1