Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.035 c
1-1130324832
AlexeyMir
2005-10-26 15:07
2005.11.20
Разделитель целой и дробной частей числа


2-1130528004
злобная танька
2005-10-28 23:33
2005.11.20
Memo


14-1130698341
midori
2005-10-30 21:52
2005.11.20
регистрация на kpnemo


4-1127118369
Quattro
2005-09-19 12:26
2005.11.20
FlashWindow


14-1130496133
Ling
2005-10-28 14:42
2005.11.20
НЕПОРЯДОК!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский