很多时候我们需要将字节数组转化为16进制字符串来保存,尤其在很多加密的场景中,例如保存密钥等。
下面使用BigInteger提供一个非常简单的方案。
package com.zzj.encryption; import java.math.BigInteger; public class Bytes2HexTest { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { String s = "我是程序猿!"; byte[] bs = s.getBytes("UTF-8"); /** * 第一个参数要设置为1 * signum of the number (-1 for negative, 0 for zero, 1 for positive). */ BigInteger bi = new BigInteger(1, bs); String hex = bi.toString(16); System.out.println(hex); // 还原 bi = new BigInteger(hex, 16); bs = bi.toByteArray();// 该数组包含此 BigInteger 的二进制补码表示形式。 byte[] tempBs = new byte[bs.length - 1]; byte[] originBs = bs; if (bs[0] == 0) { System.out.println("去补码..."); System.arraycopy(bs, 1, tempBs, 0, tempBs.length); // 去掉补码 originBs = tempBs; } s = new String(originBs, "UTF-8"); System.out.println(s); } }测试结果:
e68891e698afe7a88be5ba8fe78cbfefbc81 去补码... 我是程序猿!修改源数据:
String s = "123456";测试结果:
313233343536 123456没有去补码了!