7

4 バイトのネットワーク順 IPv4 アドレスを含む変数があります (これは pack と整数表現を使用して作成されました)。別の変数があります。これも 4 バイトのネットワーク順序のサブネットです。それらを一緒に追加して、サブネット内の最初の IP を取得するために 1 つ追加しようとしています。

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 に答える