Какой самый простой способ добавить один в двоичную строку в Perl?

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

  •  03-07-2019
  •  | 
  •  

Вопрос

У меня есть переменная, которая содержит 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top