很多时候我们需要将字节数组转化为16进制字符串来保存,例如做I/O字节流操作的时候,尤其在很多加密的场景中应用都比较广泛。
Java中byte用二进制表示占用8位,而我们知道16进制的每个字符需要用4位二进制位来表示,所以我们就可以把每个byte转换成两个相应的16进制字符,即把byte的高4位和低4位分别转换成相应的16进制字符H和L,并组合起来得到byte 转换到16进制字符串的结果new String(H) + new String(L)。即byte用十六进制表示只占2位。
从上面可以看出来我们只需要分别取出高四位和低四位的二进制值,然后进行相应的换算。
具体方案如下:
/** * 0x0F 十六进制F 相当于值 十进制 15,二进制表现形式为 0000 1111 二进制 1 & 任何数是原数 二进制 0 & 任何数是0 * * @param b * @return */ public static String byteToHexString(Byte b) { final String HEX = "0123456789abcdef"; StringBuilder sb = new StringBuilder(); /** * 为什么要与0xof运算 因为0xof的二进制是0000 1111,同时1&运算得出原数,0&运算得出0 */ // 1.取出字节b的高四位的数值并追加 // 把高四位向右移四位,与 0x0f运算得出高四位的数值 sb.append(HEX.charAt((b >> 4) & 0x0f)); // 2.取出低四位的值并追加 // 直接与 0x0f运算得出低四位的数值 sb.append(HEX.charAt(b & 0x0f)); return sb.toString(); }
总结如下:
(1)一个byte 对应两位十六进制位,而不是八位(32位二进制位);
(2)转化为十六进制之后,不足两位的,高位要补零。
本文出自 “王威” 博客,请务必保留此出处http://jaydenwang.blog.51cto.com/6033165/1746161
原文地址:http://jaydenwang.blog.51cto.com/6033165/1746161