Java 將字節數組轉化為16進制的多種方案
很多時候我們需要將字節數組轉化為16進制字符串來保存,尤其在很多加密的場景中,例如保存密鑰等。因為字節數組,除了寫入文件或者以二進制的形式寫入數據庫以外,無法直接轉為為字符串,因為字符串結尾有\0,當然肯定還有其他原因。
下面提供幾種Java中使用的方案:
方案一:直接利用BigInteger的方法,應該是最簡單的方案了。
/** * 利用簽名輔助類,將字符串字節數組 * @param str * @return */ public static byte[] md5(String str) { byte[] digest = null; try { MessageDigest md = MessageDigest.getInstance("md5"); return digest = md.digest(str.getBytes()); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return null; } /** * 方式一 * * @param bytes * @return */ public static String bytes2hex01(byte[] bytes) { /** * 第一個參數的解釋,記得一定要設置為1 * signum of the number (-1 for negative, 0 for zero, 1 for positive). */ BigInteger bigInteger = new BigInteger(1, bytes); return bigInteger.toString(16); }
注:項目中偷懶使用BigInteger將字節數組轉化為2進制字符串,發現BigInteger會省略前面的幾個0,我擦。。。以此銘記。
方案二:將每個字節與0xFF進行與運算,然后轉化為10進制,然后借助于Integer再轉化為16進制
/** * 方式二 * * @param bytes * @return */ public static String bytes2hex02(byte[] bytes) { StringBuilder sb = new StringBuilder(); String tmp = null; for (byte b : bytes) { // 將每個字節與0xFF進行與運算,然后轉化為10進制,然后借助于Integer再轉化為16進制 tmp = Integer.toHexString(0xFF & b); if (tmp.length() == 1)// 每個字節8為,轉為16進制標志,2個16進制位 { tmp = "0" + tmp; } sb.append(tmp); } return sb.toString(); }方案三:分別取出字節的高四位與低四位然后分別得出10進制0-15這樣的值,再利用一個字符串數組完美完成。對于轉化的理解,當然最推薦第三種方式了。
/** * 方式三 * * @param bytes * @return */ public static String bytes2hex03(byte[] bytes) { final String HEX = "0123456789abcdef"; StringBuilder sb = new StringBuilder(bytes.length * 2); for (byte b : bytes) { // 取出這個字節的高4位,然后與0x0f與運算,得到一個0-15之間的數據,通過HEX.charAt(0-15)即為16進制數 sb.append(HEX.charAt((b >> 4) & 0x0f)); // 取出這個字節的低位,與0x0f與運算,得到一個0-15之間的數據,通過HEX.charAt(0-15)即為16進制數 sb.append(HEX.charAt(b & 0x0f)); } return sb.toString(); }
來自: http://blog.csdn.net//lmj623565791/article/details/23609929
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!