点击这里给我发邮件
点击这里给我发消息

关于SNMP4J取值乱码解决方法

由于工作,需要使用SNMP协议取设备的数据,但是遇到中文时,尴尬出现了,一串字母数字夹带着冒号的数据,怀疑了一堆字符编码,搞了好久最后放弃了,只得强行不使用中文。一段时间后,这个问题重新出现。。。算了,估计大家不想看我唠叨,我们来解决它!

//问题原因:OctetString Class 中这两个方法
public boolean isPrintable()
{
  for (int i = 0; i < value.length; i++) {
    char c = (char)value[i];
    if (((Character.isISOControl(c)) || ((value[i] & 0xFF) >= 128)) && (!Character.isWhitespace(c)))
    {
      return false;
    }
  }
  return true;
}

public String toString() {
  if (isPrintable()) {
    return new String(value);
  }
  return toHexString();
}

  怎么解决呢,作者找到一条路后翻出好几个解决办法,一一给大家介绍

方法一:

 1 //修改snmp4j.jar toString方法 
 2   public String toString()
 3   {
 4     try
 5     {
 6       return new String(value, "iso8859_1");
 7     }
 8     catch (Exception localException)
 9     {
10       localException.printStackTrace();
11     }
12     return "";
13   }

 

方法二:

 1 public static String getFormatStr(String octetString){
 2     try{
 3         if(!octetString.contains(":")) {
 4             return octetString;
 5         }
 6         String[] temps = octetString.split(":");
 7         byte[] bs = new byte[temps.length];
 8         for(int i=0;i<temps.length;i++)
 9             bs[i] = (byte)Integer.parseInt(temps[i],16);
10             return new String(bs);
11         }catch(Exception e){
12             return null;
13     }
14   }
15 
16 str = getFormatStr(str);

方法三:

 1 str = new String(OctetString.fromHexString(stsr).getValue()) 

 

好了,暂时作者想到的解决办法就这么多,想深入了解的朋友可以根据下方给出的三种编码格式自行钻研。

涉及到的编码:ASCⅡ、ISO8859_1、GB2312

posted on 2017-08-03 16:17  菜风少侠  阅读(1840)  评论(1编辑  收藏  举报