Какой самый простой способ добавить один в двоичную строку в Perl?
Вопрос
У меня есть переменная, которая содержит 4-байтовый IPv4-адрес сетевого порядка (он был создан с использованием pack и целочисленного представления). У меня есть другая переменная, также 4-байтовый сетевой порядок, подсеть. Я пытаюсь сложить их вместе и добавить один, чтобы получить первый IP-адрес в подсети.
Чтобы получить представление ASCII, я могу сделать inet_ntoa ($ ip & amp; $ netmask)
, чтобы получить базовый адрес, но сделать inet_ntoa ((($ ip & amp; $) - ошибка маска сети) +1)
; я получаю сообщение вроде:
Argument "\n\r&\0" isn't numeric in addition (+) at test.pm line 95.
Итак, самое лучшее, что я могу сказать, это то, что он смотрит на 4 байта и видит, что 4 байта не представляют числовую строку, а затем отказывается добавлять 1.
Другой способ выразить это: что я хочу сделать, это добавить 1 к младшему байту, который, как я знаю, является 4-м байтом? То есть я хочу взять строку \ n \ r & amp; \ 0
и получить строку \ n \ r & amp; \ 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