Perlのバイナリ文字列に1を追加する最も簡単な方法は何ですか?

StackOverflow https://stackoverflow.com/questions/222043

  •  03-07-2019
  •  | 
  •  

質問

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 になります。それを行う最も簡単な方法は何ですか?

変数をアンパックして再パックすることなくこれを行う方法はありますか?

役に立ちましたか?

解決

今起こっているのは、 $ 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