Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Декодировка counter64 (SNMP)


Автор: MasterErik 10.5.2011, 12:15
Я хочу понять как работает алгоритм следующей функции.
Код

sub encode_counter64 ($) {
    return encode_intlike ($_[0], snmp_counter64_tag);
} 

sub encode_intlike ($$) {
    my ($int, $tag)=@_;
    my ($sign, $val, @vals);
    $sign = ($int >= 0) ? 0 : 0xff;
    if (ref $int && $int->isa ("Math::BigInt")) {
    for(;;) {
        $val = $int->copy()->bmod (256);
        unshift(@vals, $val);
        return encode_header ($tag, $#vals + 1).pack ("C*", @vals)
        if ($int >= -128 && $int < 128);
        $int->bsub ($sign)->bdiv (256);
    }
    } else {
    for(;;) {
        $val = $int & 0xff;
        unshift(@vals, $val);
        return encode_header ($tag, $#vals + 1).pack ("C*", @vals)
        if ($int >= -128 && $int < 128);
        $int -= $sign, $int = int($int / 256);
    }
    }
} 

К сожалению я не знаю Perl, но предполагаю что при вызове encode_counter64 срабатывает if на BigInt. Но совершенно не понимаю, что делает $val = $int->copy()->bmod (256); и $int->bsub ($sign)->bdiv (256); В общем мне нужен алгоритм этой маленькой функции, чтобы перенести ее на другой язык.


M
JackYF
Пользуемся кнопкой "код".

Автор: Pfailed 10.5.2011, 12:39
Код

if (ref $int && $int->isa ("Math::BigInt")) {


Это означает, что $int является объектом класса Math::BigInt.  А чтобы узнать что делают указанные методы читайте документацию по Math::BigInt: http://search.cpan.org/perldoc?Math::BigInt

Автор: MasterErik 10.5.2011, 13:39
Я посмотрел вашу ссылку, но осталось много непонятного. Может кто уже работал с этим классом и прокомментирует что делает эта строчка.  $val = $int->copy()->bmod (256); Где входной параметр для функции? Предположу, что он как-то оказался в $int? Тогда мы копируем $int и берем Остаток от деления $int на 256? В общем без опыта программирования на Perl я могу только предполагать.  А мне нужен точный алгоритм. Если кто может написать подробный комментарий для каждой строчки или описать алгоритм, то буду очень благодарен.

Автор: Pfailed 10.5.2011, 16:41
Да он в $int. И оказался он там не случайно. man Объектно Ориентированное Программирование

Автор: arto 10.5.2011, 17:03
может легче прочитать описание: http://www.webnms.com/snmp/help/snmpapi/snmpv3/using_mibs_in_applns/cntr64.html ?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)