in reply to Re: SNMP Trap Decoding issue
in thread SNMP Trap Decoding issue

shmem,

thank you for your wisdom.

The modules I have installed did come with ActiveState's Perl (yes on Windows :-( and from Net-SNMP)

Small problem though. The hex is stored in a variable called $encoded_pair

How do I modify your code so that it applies to $encoded_pair?
while(<DATA>) { chop; $data .= chr hex $1 while s/(..)//; }


Pretty sure it is a dump question but reading your post has improved my day and spirit a lot already.

Replies are listed 'Best First'.
Re^3: SNMP Trap Decoding issue
by shmem (Chancellor) on May 04, 2007 at 15:31 UTC
    Easy:
    $data .= chr hex $1 while $encoded_pair =~ s/(..)//;

    :-)

    If you need your $encoded_pair for any other purpose after that, make a copy first, since the s/// is destructive. Or, better, do

    $data = join '', map { chr hex $_ } $encoded_pair =~ /(..)/g;

    BTW, could you please reformat your OP and wrap your HEX string in <code> tags? Thank you.

    --shmem

    _($_=" "x(1<<5)."?\n".q·/)Oo.  G°\        /
                                  /\_¯/(q    /
    ----------------------------  \__(m.====·.(_("always off the crowd"))."·
    ");sub _{s./.($e="'Itrs `mnsgdq Gdbj O`qkdq")=~y/"-y/#-z/;$e.e && print}
      I have wrapped the HEX code sorry for that. What do you mean with OP

      I have tried your code as follows but it does not produce any output:
      #!/usr/bin/perl use Encoding::BER::SNMP; my $temp="3014060e2b06010401090929010203010200040232303013060e2b060104 +01090929010203010300020105301d060e2b06010401090929010203010400040b537 +9736c6f67205472617030818c060e2b06010401090929010203010500047a31303630 +32333a2044656e792069636d7020737263206f7574736964653a3231362e3139362e3 +6342e3132342064737420696e736964653a3230382e3130392e39302e323120287479 +706520382c20636f6465203029206279206163636573732d67726f757020226f75747 +36964655f6163636573735f696e223016060e2b060104010909290102030106004304 +73c36bf8"; $data .= chr hex $1 while $temp=s/(..)//; my $enc = Encoding::BER::SNMP->new(); while ($data) { my $result = $enc->decode($data); my $oid = $result->{'value'}->[0]->{'value'}; my $value = $result->{'value'}->[1]->{'value'}; print "returned pair: $oid -> $value\n"; my $back = $enc->encode($result); $data =~ s/\Q$back\E// or last; }
      I am starting to feel that I am doing really stupid but I just can't see what :-)
        I solved it (maybe unconvential perl coding but it worked) It finally works thanks to your valuable help shmem!
        You missed a ~
        - $data .= chr hex $1 while $temp=s/(..)//; + $data .= chr hex $1 while $temp=~s/(..)//;

        OP = original post(er). BTW, welcome to the monastery! :-)

        --shmem

        _($_=" "x(1<<5)."?\n".q·/)Oo.  G°\        /
                                      /\_¯/(q    /
        ----------------------------  \__(m.====·.(_("always off the crowd"))."·
        ");sub _{s./.($e="'Itrs `mnsgdq Gdbj O`qkdq")=~y/"-y/#-z/;$e.e && print}