Я хочу понять как работает алгоритм следующей функции.
| Код | 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 | Пользуемся кнопкой "код". |
|