From: Tadashi Oh-Ya Date: 2002-12-19T15:49:32+09:00 Subject: [ruby-list:36809] Re: Ruby SNMPについて おおやと申します。 先回の、Ruby SNMPでOCTETが表示できない件について、一応 表示形式を <得られる出力> 1.3.6.1.2.1.17.1.1.0 = 08 00 46 22 76 ce とすることができました。 わかってみれば非常に単純な解でした。 -------------------------------ここから------------------------------- *** snmp_sess.c.orig Sat Dec 14 11:55:27 2002 --- snmp_sess.c Thu Dec 19 15:21:50 2002 *************** *** 525,537 **** struct variable_list *var; size_t i; VALUE ary; Data_Get_Struct(csnmpvar, struct variable_list, var); switch(var->type) { case ASN_INTEGER: return INT2NUM(*var->val.integer); case ASN_OCTET_STR: ! return rb_str_new(var->val.string, var->val_len); case ASN_OPAQUE: return Qnil; case ASN_OBJECT_ID: --- 525,557 ---- struct variable_list *var; size_t i; VALUE ary; + int ishex = 0, x = 0; + u_char *cp; + u_char *hex; Data_Get_Struct(csnmpvar, struct variable_list, var); switch(var->type) { case ASN_INTEGER: return INT2NUM(*var->val.integer); case ASN_OCTET_STR: ! ishex = 0; ! for(cp = var->val.string, x = 0; x < (int)var->val_len; x++, cp++) { ! if (!(isprint(*cp) || isspace(*cp))) { ! ishex = 1; ! } ! } ! ! if(ishex) { /* value is hex */ ! /* ary = rb_ary_new2((int)var->val_len); */ ! ary = rb_ary_new(); ! for(cp = var->val.string, x = 0; x < (int)var->val_len; x++, cp++) { ! sprintf(hex, "%02x ", (int)*cp); ! rb_ary_push(ary, rb_str_new2(hex)); ! } ! return ary; ! } else { /* value is string */ ! return rb_str_new(var->val.string, var->val_len); ! } case ASN_OPAQUE: return Qnil; case ASN_OBJECT_ID: -------------------------------ここまで------------------------------- とりあえず自分は満足できたということで、お知らせまで。