欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  技术分享

Java或Android中String byte HexString 16进制字符串的转换

程序员文章站 2022-03-01 13:30:08
...

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