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

要获得ASCII表示,我可以使用 inet_ntoa($ ip& $ netmask)来获取基址,但是 inet_ntoa(($ ip& $)是一个错误网络掩码)+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 。这样做最简单的方法是什么?

有没有办法在不必解压缩和重新打包变量的情况下执行此操作?

有帮助吗?

解决方案

发生的事情是您使用 $ ip& $ netmask 创建一个字节字符串,然后尝试将其视为一个数字。这不会起作用。您必须提供给 inet_ntoa 的内容是。

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

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

其他提示

令人困惑的整数和字符串。也许以下代码会有所帮助:

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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top