Snmp乱码问题

来源:互联网 发布:学校网络解决方案 编辑:程序博客网 时间:2024/06/05 09:33

1.前言:

在开发Snmp协议传输数据的时候,发现中文会乱码,网上找的解决方案基本都是说,因为源码的问题,要改动源码,但是感觉改动源码太难了,很多内部调用并不是所有人都能搞得定的。

2.乱码原因

以下是乱码的源头,因为默认超过128的位数的字节,都按16进制处理

public class OctetString extends AbstractVariable    implements AssignableFromByteArray, AssignableFromString {    public String toString() {        if (isPrintable()) {          return new String(value);        }      //没通过isPrintable(),如ASCII控制字符,汉字等,都以16进制显示        return toHexString();      }   public boolean isPrintable() {    for (int i=0; i<value.length; i++) {      char c = (char)value[i];     //判断是否大于0x80 (大于128的ASCII码,汉字编码都在这个区间内)      if ((Character.isISOControl(c) ||       ((value[i] & 0xFF) >= 0x80))(!Character.isWhitespace(c))){        return false;      }    }    return true;  }

3.解决思路

将传过来的16进制,转换为中文,无须改动源码,实现代码如下:

    Vector<VariableBinding> recVBs =          (Vector<VariableBinding>) pdu.getVariableBindings();    for (int i = 0; i < recVBs.size(); i++) {        VariableBinding recVB = recVBs.elementAt(i);        //获取要转换的16进制字节        String os = recVB.getVariable().toString();        if(!(os.indexOf(":") == -1)) {           String[] temps = os.split(":");           byte[] bs = new byte[temps.length];             for(int j = 0;j<temps.length;j++){              //转换byte[]              bs[j] = (byte)Integer.parseInt(temps[j],16);            }            try{                //转换String,编码集根据发Snmp的编码集来                os = new String(bs,"GBK");                System.out.println(os);            }catch (UnsupportedEncodingException e) {                e.printStackTrace();            }        }        SetSnmpData(recVB.getOid()+"----",os);    }
1 0
原创粉丝点击