public class BinaryTest {
public static String byteToHex(byte[] bytes) {
StringBuilder result = new StringBuilder();
for (byte b : bytes) {
int temp = b & 0xFF;
String v = Integer.toHexString(temp);
result.append(v);
}
return result.toString();
}
}
测试
@Test
public void testBinary03() {
System.out.println(BinaryUtils.byteToHex(new byte[]{127})); // 7f
System.out.println(BinaryUtils.byteToHex(new byte[]{-119})); // 89
}
int temp = b & 0xFF;
,为什么要& 0xFF
?
Integer.toHexString(int i)
接收的参数是 int 类型- byte 会先转换成 int,正数高位补 0,没影响,但负数高位补 1,就有影响了(与:ffffff89,不与:89),ffffff是无效的
& 0xFF
后,可以把高位变成 0
// 以 -119 为例
-119
byte
原码:1111 0111
反码:1000 1000
补码:1000 1001
int
原码:1000 0000 0000 0000 0000 0000 0111 0111
反码:1111 1111 1111 1111 1111 1111 1000 1000
补码:1111 1111 1111 1111 1111 1111 1000 1001
0xFF:0000 0000 0000 0000 0000 0000 1111 1111
计算机基础概念
以下来自:原码,补码和反码
- 机器数:一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1。
- 真值:因为第一位是符号位,所以机器数的形式值就不等于真正的数值。为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。
- 原码:符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。
- 反码
- 正数的反码是其本身
- 负数的反码是在其原码的基础上, 符号位不变,其余各个位取反
- 补码
- 正数的补码就是其本身
- 负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
备注:
- 计算机都是使用补码,方便计算
- 使用原码或反码表示的范围为[-127, +127], 而使用补码表示的范围为[-128, 127]