Java中的byte类型

246 阅读1分钟

在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();
}