字节数组与16进制字符串的相互转换
众所周知,⼆进制数据(包括内存地址)在计算机中⼀般以16进制的⽅式表⽰,⼤家也习惯使⽤16进制来查看、记录⼆进制数据,所以看了⼀下Java中字节与16进制的相互转
换。因为⼤多数情况下我们遇到的都是字节数组,所以本⽂是以字节数据与16进制字符串的相互转换为例。
先说⼀下看字节与16进制转换问题的缘由。在项⽬中,我准备写⼀个MD5的⼯具⽅法,使⽤的是JDK⾃带的 MessageDigest 信息摘要类,代码如下:
MessageDigest md5Digest = Instance("MD5");
byte[] btArr = md5Digest.Bytes());
很明显,我在调⽤了信息摘要⽅法之后,得到的是⼀个字节数组 byte[] ,⽽我想要的 MD5 ⽅法应该是像⼤多数md5⼯具⼀样,返回⼀个 32 位的字符串。
简单查了⼀下,才知道原来 MD5 信息摘要算法返回的结果是⼀个 128 bit 的⼆进制数据,128 bit 正好是 16个 byte,⽽1个byte转成16进制正好是2位(16进制使⽤4个bit,⼀个
byte有8个bit),所以MD5算法返回的128bit 转成 16进制就正好是 32位。
听着可能有点绕,简单的说,上述代码中md5信息摘要之后,返回了⼀个有 16个字节的字节数组,⽽现在需要做的就是把这个字节数组转成16进制格式的数据。
回到正题,字节与16进制相互转换的代码如下:
public class HexTest {
private static final char HexCharArr[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
private static final String HexStr = "0123456789abcdef";
public static String byteArrToHex(byte[] btArr) {
char strArr[] = new char[btArr.length * 2];
int i = 0;
for (byte bt : btArr) {
strArr[i++] = HexCharArr[bt>>>4 & 0xf];
java数组字符串转数组strArr[i++] = HexCharArr[bt & 0xf];
}
return new String(strArr);
}
public static byte[] hexToByteArr(String hexStr) {
char[] charArr = CharArray();
byte btArr[] = new byte[charArr.length / 2];
int index = 0;
for (int i = 0; i < charArr.length; i++) {
int highBit = HexStr.indexOf(charArr[i]);
int lowBit = HexStr.indexOf(charArr[++i]);
btArr[index] = (byte) (highBit << 4 | lowBit);
index++;
}
return btArr;
}
}
byteArrToHex 字节数组转成16进制字符串
基本的算法是:把⼀个字节分成⾼4位的bit和低4位的bit,先取⾼4位的bit,得到这4位bit对应的数字(范围在0~15),就可以知道对应的16进制数是多少了;按同样的⽅式取到低4位bit对应的16进制数,把这些16进制数放到⼀个数组⾥,最后串成⼀个hexToByteArr 16进制字符串转成字节数组
基本的算法是:把16进制字符串分成⼀个的char数组,循环取其中的两个char,这两个char的值⼀定都是在[0123456789abcdef]之间;先到第⼀个char对应的下标位置,⽐如说char的值为 a,那么下标位
置就是 10,把数字10转成byte类型,取低4位因16进制只需占⽤4个bit,⽽⼀个字节有8个bit,所以字节转16进制的时候需要拆开来转换,⼀个字节对应两个16进制字符;⽽16进制字符串转成字节的时候,需要⽤两个16进制数对应的bit拼接起来才能组成⼀个完整的字节,转换后得到的字节数组的(完)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论