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);
}