最近在搞这个16进制报文,网上找了很多地方,解出来的结果不是乱码就是报错,干脆自己写了。
大概是这样的,16进制的报文大家都知道是什么样子 例如:
3C E4 BA A4 E6 98 93 E6 88 90 E5 8A 9F EF BC 81 3E 20 3C 42 61 6B 31 2F 3E
因为其中包含有中文,所以使用常规的强转的话是不成功的,会出现乱码,头开始一直以为是编码的问题,结果发现并不是,太坑了 。
相较于这种,考虑到这些字符都可以转换成字节形式,通过字节byte这个媒介,可以进行16进制和报文的转换。
这个是单个16进制字符的转换
/*** @Author 宇智波波奶茶* @param inHex* @return byte*/public static byte hexToByte(String inHex){return (byte) Integer.parseInt(inHex,16);}
如果想转换长串的话,就需要得到byte类型的数组了
/*** @Author 宇智波波奶茶* @param inHex* @return byte[]*/public static byte[] hexToByteArr(String inHex){inHex = inHex.replaceAll(" ","").replaceAll("\n","");int hexlen = inHex.length();byte[] result;if (hexlen % 2 == 1){hexlen ++;inHex = "0" + inHex;result = new byte[(hexlen/2)];} else {result = new byte[(hexlen/2)];}int j = 0;for (int i = 0; i < hexlen; i+=2) {result[j] = hexToByte(inHex.substring(i,i+2));j++;}return result;}
最后可以通过得到的byte数组,通过String构造方法,根据原有报文的编码格式,转化为字符串
public void test(){String hexStr = "3C E4 BA A4 E6 98 93 E6 88 90 E5 8A 9F EF BC 81 3E 20 3C 42 61 6B 31 2F 3E";byte[] bytes = hexToByteArr(hexStr);String s = new String(bytes, StandardCharsets.UTF_8);System.out.printf("16进制报文为:%s\n转为报文为:%s",hexStr,s);}
接下来是 中英文报文转16进制的方法
/*** @Author 宇智波波奶茶* @param inHex* @return byte[]*/public static String strToHex(String s){byte[] bt = s.getBytes();StringBuilder s1 = new StringBuilder();for (int i = 0; i < bt.length; i++) {String tempStr = Integer.toHexString(bt[i]);if (tempStr.length() > 2){tempStr = tempStr.substring(tempStr.length() - 2);}if (tempStr.length() < 2){tempStr = "0" + tempStr;}s1.append(tempStr);}return s1.toString().toUpperCase();}
最后结果打印出来