Главная страница
    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.041 c
14-1130397025
Андрей Жук
2005-10-27 11:10
2005.11.20
Вопрос по Excel


14-1130737263
Ega23
2005-10-31 08:41
2005.11.20
С днем рождения! 31 октября


6-1123645641
Big Joe
2005-08-10 07:47
2005.11.20
Помогите с сокетом


14-1130418543
Иксик
2005-10-27 17:09
2005.11.20
Люди, мозги не варят, а книгу нужно заказать... помогите, а?


2-1130453251
Dub
2005-10-28 02:47
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский