在Java中,byte类型用1个字节表示,即8位,表示范围为:-128~127。
我们经常需要和字节数组打交道,来看看如下的两个常见问题。
对于一个字节数组,其中的各数在内存中是如何表示的呢?
byte[] nums = { -1, -127, 10, 17, 127 };
这个字节数组中既包含正数,也包含负数。我们先来看正数:
- 10:
0000 1010 - 17:
0001 0001 - 127:
0111 1111
负数则是用补码的形式存储的。计算规则如下:
- 第一步:确定其正数的二进制表示形式。比如:-1,那么其正数为1,正数1的表示形式为:
0000 0001; - 第二步:取反。将正数1的各位进行取反操作,得到的形式为
1111 1110; - 第三步:加1。得到的最中形式为
1111 1111。
综上,-1的表现形式就是1111 1111。
依次类推,可以得到-127在内存中的存储形式为:1000 0001。
如何将一个字节数组转换为十六进制字符串形式呢?
还是上面的那个字节数组,如何将其转换为十六进制字符串形式呢?
一种方式是使用 String.format() 方法:
public static String toHexString1(byte[] nums) {
var sb = new StringBuilder();
for (byte b : nums) {
String hex = String.format("%02x", b);
sb.append(hex);
}
return sb.toString();
}
还有一种方式是使用 Integer.toHexString() 方法:
public static String toHexString2(byte[] nums) {
var sb = new StringBuilder();
for (byte b : nums) {
String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) {
sb.append("0");
}
sb.append(hex);
}
return sb.toString();
}