java字节数组转换成16进制_Java 将字节数组转化为16进制的多种方案
很多時候我們需要將字節(jié)數(shù)組轉(zhuǎn)化為16進(jìn)制字符串來保存,尤其在很多加密的場景中,例如保存密鑰等。因?yàn)樽止?jié)數(shù)組,除了寫入文件或者以二進(jìn)制的形式寫入數(shù)據(jù)庫以外,無法直接轉(zhuǎn)為為字符串,因?yàn)樽址Y(jié)尾有\(zhòng)0,當(dāng)然肯定還有其他原因。
下面提供幾種Java中使用的方案:
方案一:直接利用BigInteger的方法,應(yīng)該是最簡單的方案了。
/**
* 利用簽名輔助類,將字符串字節(jié)數(shù)組
* @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)
{
/**
* 第一個參數(shù)的解釋,記得一定要設(shè)置為1
* signum of the number (-1 for negative, 0 for zero, 1 for positive).
*/
BigInteger bigInteger = new BigInteger(1, bytes);
return bigInteger.toString(16);
}
注:項(xiàng)目中偷懶使用BigInteger將字節(jié)數(shù)組轉(zhuǎn)化為2進(jìn)制字符串,發(fā)現(xiàn)BigInteger會省略前面的幾個0,我擦。。。以此銘記。
方案二:將每個字節(jié)與0xFF進(jìn)行與運(yùn)算,然后轉(zhuǎn)化為10進(jìn)制,然后借助于Integer再轉(zhuǎn)化為16進(jìn)制
/**
* 方式二
*
* @param bytes
* @return
*/
public static String bytes2hex02(byte[] bytes)
{
StringBuilder sb = new StringBuilder();
String tmp = null;
for (byte b : bytes)
{
// 將每個字節(jié)與0xFF進(jìn)行與運(yùn)算,然后轉(zhuǎn)化為10進(jìn)制,然后借助于Integer再轉(zhuǎn)化為16進(jìn)制
tmp = Integer.toHexString(0xFF & b);
if (tmp.length() == 1)// 每個字節(jié)8為,轉(zhuǎn)為16進(jìn)制標(biāo)志,2個16進(jìn)制位
{
tmp = "0" + tmp;
}
sb.append(tmp);
}
return sb.toString();
}方案三:分別取出字節(jié)的高四位與低四位然后分別得出10進(jìn)制0-15這樣的值,再利用一個字符串?dāng)?shù)組完美完成。對于轉(zhuǎn)化的理解,當(dāng)然最推薦第三種方式了。
/**
* 方式三
*
* @param bytes
* @return
*/
public static String bytes2hex03(byte[] bytes)
{
final String HEX = "0123456789abcdef";
StringBuilder sb = new StringBuilder(bytes.length * 2);
for (byte b : bytes)
{
// 取出這個字節(jié)的高4位,然后與0x0f與運(yùn)算,得到一個0-15之間的數(shù)據(jù),通過HEX.charAt(0-15)即為16進(jìn)制數(shù)
sb.append(HEX.charAt((b >> 4) & 0x0f));
// 取出這個字節(jié)的低位,與0x0f與運(yùn)算,得到一個0-15之間的數(shù)據(jù),通過HEX.charAt(0-15)即為16進(jìn)制數(shù)
sb.append(HEX.charAt(b & 0x0f));
}
return sb.toString();
}
版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。
總結(jié)
以上是生活随笔為你收集整理的java字节数组转换成16进制_Java 将字节数组转化为16进制的多种方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 钻石水晶幸运值多少满
- 下一篇: java基础格式_Java基础之代码的基