7

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

要获取 ASCII 表示,我可以inet_ntoa($ip&$netmask)获取基地址,但这样做是错误的inet_ntoa((($ip&$netmask)+1);我收到如下消息:

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

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

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

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

4

2 回答 2

13

发生的事情是您使用 制作一个字节字符串$ip&$netmask,然后尝试将其视为一个数字。像这样的,这是行不通的。你必须喂的inet_ntoa是。

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

我认为没有更简单的方法可以做到这一点。

于 2008-10-21T14:31:36.813 回答
8

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

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), "\n";

哪个输出:

192.168.250.1
于 2008-10-21T14:51:16.103 回答