Java 將字節數組轉化為16進制的多種方案

jopen 8年前發布 | 12K 次閱讀 Java開發

很多時候我們需要將字節數組轉化為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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!