Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.20;
Скачать: CL | DM;

Вниз

Perl-функция pack   Найти похожие ветки 

 
Джо ©   (2005-10-25 21:37) [0]

Знатоки Перла, объясните, плиз, человеческими словами, что именно проделывает нижеприведенный вызов функции

$raw = pack ("B32", (1 x $mask), (1 x (32 - $mask)));

Например, при $mask=30 на выходе имеем 4244635647.
Накопал описание сабжевой функции, но понять механизм не могу, так как даже понятия не имею, что означает "x".
Сорри, Перла не знаю совсем и, похоже, за пару часов выучить его так и не смог :)


 
palva ©   (2005-10-25 22:17) [1]

Пусть $mask = 30
(1 x $mask) означает строку, где левый аргумент "1" повторяется $mask раз. "B32" означает, что аргумент интерпретируется как 32-битная строка, два правых бита остаются нулевыми. Второй аргумент функции pack в данном случае не используется. Результат функции упаковывается в строку $raw и занимает 4 байта. Если двоичное представление этой строки рассматривать как двоичное представление целого числа (порядок байтов в числе обратный), то получится ваше число 4244635647 Правда, вы не написали, как вы получили это число.


 
Kerk ©   (2005-10-25 22:33) [2]

Perl - язык для шаманов (с) Я :)


 
Джо ©   (2005-10-25 22:41) [3]


> [1] palva ©   (25.10.05 22:17)

Большое спасибо за помощь. А то уже стал закипать 8-|
Непонятно, все-же, зачем там второй аргумент, но это мелочи :)

Это я пытался разпарсить подсеть/маску вида a.b.c.d/mask. Никак не мог понять принцип, по которому этот mask преобразуется. А из примеров в сетке нашел только на Перле, будь он неладен :) Но ничего, теперь понятно. Еще раз спасибо. Буду сейчас думать как на Паскале перекрутить попроще.


 
Джо ©   (2005-10-25 22:42) [4]


> [2] Kerk ©   (25.10.05 22:33)
> Perl - язык для шаманов (с) Я :)

Не то слово ;)


 
palva ©   (2005-10-25 22:45) [5]

> Буду сейчас думать как на Паскале перекрутить попроще.
А зачем на паскале? На перле прикольней.


 
Джо ©   (2005-10-25 22:50) [6]


>  [5] palva ©   (25.10.05 22:45)
> А зачем на паскале? На перле прикольней.

Насчет прикольней-то оно, конечно, да. Но программа на Делфи пишется, так что никуда не денешься. А Перлу уже анинсталл сделал, т.к., он мне нужен был только чтобы с примером разобраться. Как оказалось, без посторонней помощи все-равно не разобрался бы. Спасибо :)

Уже в качестве оффтопа, на Паскале, по-моему, проще и быстрее всего готовый массив констант сделать, благо, значений всего 32.


 
isasa ©   (2005-10-25 22:55) [7]

проще и быстрее всего готовый массив констант сделать, благо, значений всего 32.

A почему не DWORD ?

subnet:=(ip and mask);
....


 
Джо ©   (2005-10-25 23:00) [8]


> [7] isasa ©   (25.10.05 22:55)

Не понял.


 
isasa ©   (2005-10-25 23:14) [9]

Джо ©   (25.10.05 23:00) [8]

Ты хочешь получить адрес подсети? Или я неправильно понял?


 
Джо ©   (2005-10-25 23:26) [10]


>  [9] isasa ©   (25.10.05 23:14)

Есть адрес, записанный в форме a.b.c.d/m, например
123.123.45.4/30
Вот нужно это 30 (m) перевести в форму:
11111100 11111111 11111111 11111111b = 0xFCFFFFFF =  4244635647 Dec.
Назовем это значение mm.
Собственно, я уже разобрался как это делается.

А нужно это для того, чтобы выяснить вхождение адреса в подсеть, записанную вышеуказанным образом, т.е, вхождение имеет место если справедливо:
some_ip and mm = net_ip

some_ip - адрес, записанный с обратным порядком байт
net_ip - a.b.c.d. с обратным порядком байт

Все вроде нормально таким образом считается, достаточно вычислить это mm. Или я чего-то перемудрил?


 
isasa ©   (2005-10-25 23:50) [11]

А что-то, типа..

i:=1;
mm:=0;
while i<=n do begin
 mm:=mm*power(2, 32-i);
 i:=i+1;
end;

n:=30 <- mask
Сейчас, хоть убей не вспомню, power - overload, или нет. Но возводить целое в целую.


 
Kerk ©   (2005-10-25 23:51) [12]

isasa ©   (25.10.05 23:50) [11]
mm:=mm*power(2, 32-i);


зачем power? shl отменили?


 
isasa ©   (2005-10-25 23:57) [13]

Виноват. :)
Пора идти спать.


 
isasa ©   (2005-10-26 00:07) [14]

Сорри, ошибка.

...
mm:=1;
while i<=n do begin
...


 
Джо ©   (2005-10-26 00:26) [15]

Да, все равно по таблице быстрее считается ;)



Страницы: 1 вся ветка

Текущий архив: 2005.11.20;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.045 c
4-1127110999
SergeyGood
2005-09-19 10:23
2005.11.20
Запуск от имени


2-1130596420
ruslan1
2005-10-29 18:33
2005.11.20
LPT порт


14-1130307967
stone
2005-10-26 10:26
2005.11.20
Всех москвичей с первым снегом!


2-1130920589
Ale-x
2005-11-02 11:36
2005.11.20
Автозапуск


8-1113905574
LineSoft
2005-04-19 14:12
2005.11.20
SD4.DLL - недопустимая операция