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