我方发送的报文,对方接收到后直接就是十六进制数据,但对方需要的是转为十六进制前的字符串;
错误采用方法:
/**
* 将十六进制转为字符串
* 该方法 解析的报文 设备接收到后会出错 符号前会加C2
* @param hex
* @return
*/
public static String convertHexToString(String hex){
StringBuilder sb = new StringBuilder();
StringBuilder temp = new StringBuilder();
//49204c6f7665204a617661 split into two characters 49, 20, 4c...
for( int i=0; i<hex.length()-1; i+=2 ){
//grab the hex in pairs
String output = hex.substring(i, (i + 2));
//convert hex to decimal
int decimal = Integer.parseInt(output, 16);
//convert the decimal to character
sb.append((char)decimal);
temp.append(decimal);
}
return sb.toString();
}
/**
* 字符串转十六进制
* 与convertHexToString方法 互相转换 可以实现编码解码
* @param str
* @return
*/
public static String convertStringToHex(String str){
char[] chars = str.toCharArray();
StringBuffer hex = new StringBuffer();
for(int i = 0; i < chars.length; i++){
hex.append(Integer.toHexString((int)chars[i]));
}
return hex.toString();
}
调用方法:
session.write(IoBuffer.wrap(test.convertHexToString("01100064000A14000000010000000100010000000100010000000112BA").getBytes()));
结果:当出现特殊符号时,对方接收到转为十六进制后,其特殊符号前有C2标识符;
分析结果:
自测:使用convertHexToString转为字符串,再使用convertStringToHex方法转为十六进制;
推断:在调用session处,由于getBytes方法造成错误;将转字节数组的方法也放入转字符串的方法中;
正确方法:
/**
*该方法 为 将十六进制字符串转为 十六进制数组然后转为字符串
*/
public static byte[] toByteArray(String hexString) {
if (hexString == null || "".equals(hexString))
throw new IllegalArgumentException("this hexString must not be empty");
hexString = hexString.toLowerCase();
final byte[] byteArray = new byte[hexString.length() / 2];
int k = 0;
for (int i = 0; i < byteArray.length; i++) {//因为是16进制,最多只会占用4位,转换成字节需要两个16进制的字符,高位在先
byte high = (byte) (Character.digit(hexString.charAt(k), 16) & 0xff);
byte low = (byte) (Character.digit(hexString.charAt(k + 1), 16) & 0xff);
byteArray[i] = (byte) (high << 4 | low);
k += 2;
}
return byteArray;
}
调用:
session.write(IoBuffer.wrap(toByteArray("01100064000A14000000010000000100010000000100010000000112BA")));