Java或Android中String byte HexString 16进制字符串的转换
2015-06-12 16:11:54  By: dwtedx

Java中byte用二进制表示占用8位、而我们知道16进制的每个字符需要用4位二进制位来表示(23 22 21 20 = 15)、所以我们就可以把每个byte转换成两个相应的16进制字符、即把byte的高4位和低4位分别转换成相应的16进制字符H和L、并组合起来得到byte转换到16进制字符串的结果new String(H) new String(L)、即byte用十六进制表示只占2位

同理、相反的转换也是将两个16进制字符转换成一个byte、原理同上、根据以上原理、我们就可以将byte[] 数组转换为16进制字符串了、当然也可以将16进制字符串转换为byte[]数组了、这里我们可以将byte转换成int、然后利用Integer.toHexString(int)来转换成16进制字符串


byte[] to String

 /**
 * Convert byte[] to hex string
 * @param src byte[] data   
 * @return hex string   
 */      
public static String bytesToHexString(byte[] src){   
    StringBuilder stringBuilder = new StringBuilder("");   
    if (src == null || src.length <= 0) {   
        return null;   
    }   
    for (int i = 0; i < src.length; i  ) {   
        int v = src[i] & 0xFF;   
        String hv = Integer.toHexString(v);   
        if (hv.length() < 2) {   
            stringBuilder.append(0);   
        }   
        stringBuilder.append(hv);   
    }   
    return stringBuilder.toString();   
} 


String to byte[]

/**  
 * Convert hex string to byte[]  
 * @param hexString the hex string  
 * @return byte[]  
 */  
public static byte[] hexStringToBytes(String hexString) {   
    if (hexString == null || hexString.equals("")) {   
        return null;   
    }   
    hexString = hexString.toUpperCase();   
    int length = hexString.length() / 2;   
    char[] hexChars = hexString.toCharArray();   
    byte[] d = new byte[length];   
    for (int i = 0; i < length; i  ) {   
        int pos = i * 2;   
        d[i] = (byte) (charToByte(hexChars[pos]) << 4 
			| charToByte(hexChars[pos   1]));   
    }   
    return d;   
} 


char to byte

/**  
 * Convert char to byte  
 * @param c char  
 * @return byte  
 */  
 private byte charToByte(char c) {   
    return (byte) "0123456789ABCDEF".indexOf(c);   
} 


Q&A:java中byte转换int时为何与0xff进行与运算、在剖析该问题前请看如下代码

public static String bytes2HexString(byte[] b) {   
  String ret = "";   
  for (int i = 0; i < b.length; i  ) {   
   String hex = Integer.toHexString(b[ i ] & 0xFF);   
   if (hex.length() == 1) {   
    hex = ´0´   hex;   
   }   
   ret  = hex.toUpperCase();   
  }   
  return ret;   
}


上面是将byte[]转化十六进制的字符串、注意这里b[ i ] & 0xFF将一个byte和 0xFF进行了与运算、然后使用Integer.toHexString取得了十六进制字符串、可以看出
b[ i ] & 0xFF运算后得出的仍然是个int、那么为何要和 0xFF进行与运算呢?直接 Integer.toHexString(b[ i ]);、将byte强转为int不行吗?答案是不行的


其原因在于:

1.byte的大小为8bits而int的大小为32bits

2.java的二进制采用的是补码形式


在这里先温习下计算机基础理论、byte是一个字节保存的、有8个位、即8个0、1、8位的第一个位是符号位、也就是说0000 0001代表的是数字1、1000 0000代表的就是-1、所以正数最大位0111 1111、也就是数字127、负数最大为1111 1111、也就是数字-128

若资源对你有帮助、浏览后有很大收获、不妨小额打赏我一下、你的鼓励是维持我不断写博客最大动力

想获取DD博客最新代码、你可以扫描下方的二维码、关注DD博客微信公众号(ddblogs)

或者你也可以关注我的新浪微博、了解DD博客的最新动态:DD博客官方微博(dwtedx的微博)

如对资源有任何疑问或觉得仍然有很大的改善空间、可以对该博文进行评论、希望不吝赐教

为保证及时回复、可以使用博客留言板给我留言: DD博客留言板(dwtedx的留言板)

感谢你的访问、祝你生活愉快、工作顺心、欢迎常来逛逛


快速评论


技术评论

  • 该技术还没有评论、赶快抢沙发吧...
DD记账
top
+