前几天公司进行业务升级,需要将数据上链(之前只是将业务hash上链),上链后发现区块链平台没有对上上去的数据进行处理,取下来就是一串16进制的字符。因为我们这边需要将上链的数据进行回显,所以需要对这些16进制数据进行转换,而2个16进制数表示一个字节,所以就可以确定是2个字符为一组的。问了区块链平台的人,这些字符是char类型且是按utf-8编码的。
思路
最终肯定是要调用jdk提供的方法,按照utf-8进行解码。但是java直接处理16机制数不太方便,所以思路就是先将16进制数转换为10进制数存入byte数组中,最后调用new String(bytes[],charsetName)方法得到最终结果。
过程
我们这里因为是2个字符为一组的,所以转换方法就是第一位10进制数乘以16再加上第二位的10进制数,例如:2b转换为10进制就是2*16+11=43。
然后因为要现将字符串转换为char,而16进制又是由0-9的数字和a-f的字母组成的,所以转化成char后我们需要把原来具体每一位10进制的数算出来。例如:同样是16进制字符2b,字符2对应的10进制ascii码值是50,所以我们需要减去字符0(数字的起始字符)的10进制ascii码值48,从而得到字符2的10进制数2。
对于字母也是一样,字符b对应的10进制ascii码值是98,再减去字符a的(小写字母的起始字符)10进制ascii码值97,这里要记得加上10,因为字母a相当于10进制数10,得到字符a的10进制数11。
代码如下:
public static String HexToString(String str) throws UnsupportedEncodingException {
char[] chars = str.