Какой самый простой способ добавить один в двоичную строку в Perl? - PullRequest
7 голосов
/ 21 октября 2008

У меня есть переменная, которая содержит 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. Какой самый простой способ сделать это?

Есть ли способ сделать это без необходимости распаковывать и переупаковывать переменную?

Ответы [ 2 ]

13 голосов
/ 21 октября 2008

Происходит то, что вы создаете байтовую строку с $ip&$netmask, а затем пытаетесь рассматривать ее как число. Это не сработает как таковое. То, что вы должны кормить inet_ntoa, это.

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

Я не думаю, что есть более простой способ сделать это.

8 голосов
/ 21 октября 2008

Запутанные целые числа и строки. Возможно, следующий код поможет:

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
...