Java或Android中String byte HexString 16进制字符串的转换
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