2008-10-21 9 views
7

У меня есть переменная, которая содержит 4 байта, адрес IPv4 сетевого порядка (это было создано с использованием пакета и целочисленного представления). У меня есть другая переменная, также 4-байтовый сетевой порядок, подсеть. Я пытаюсь добавить их вместе и добавить один, чтобы получить первый IP-адрес в подсети.Каков самый простой способ добавить один к двоичной строке в Perl?

Чтобы получить представление 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 байта не представляют собой числовую строку, а затем отказывающегося add 1.

Другой способ: я хочу, чтобы это добавило 1 к младшему значащему байту, который я знаю, это 4-й байт? То есть, я хочу взять строку \n\r&\0 и в итоге получить строку \n\r&\1. Каков самый простой способ сделать это?

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

ответ

13

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

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

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

+0

Я думаю, что вы правы. Просто пытался понять, есть ли более простой способ, но, увы, не может быть. – 2008-10-21 14:44:48

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