Integer.toHexString((byte & 0xFF) | 0x100).substring(1, 3)

Integer.toHexString要求入参为int基本类型

(byte & 0xFF) | 0x100会计算得出一个byte,之后byte转int,正数会高24位补0,负数会高24位补1,接着截取字符串

**byte & 0xFF ** java中byte转int采取的补符号位扩展,这一段的作用是补零扩展。因为补符号位扩展的结果是十进制不变,原二进制改变。补零扩展为十进制改变,但是二进制不变。这里关心的并不是扩展后十进制是否相同,而是关心的二进制是否相同。

计算机存储的是数值的补码,正数的补码为原二进制码,负数的补码为原二进制码除符号位取反+1

以-127为例,二进制为1111 1111,反码1000 0000,补码1000 0001

补码 1000 0001
补零扩展 0000 0000 0000 0000 0000 0000 1000 0001
补零扩展后的补码 0000 0000 0000 0000 0000 0000 1000 0001
补零扩展后的十进制 129
补符号位扩展 1111 1111 1111 1111 1111 1111 1000 0001
补符号位扩展后的补码 1000 0000 0000 0000 0000 0000 0111 1111
补符号位的十进制 -127

**| 0x100 ** 之前计算的结果为高24位为0,低8位如01111111,与上0x100后,结果11111111。如果低8位为10000001,则没有变化。可以发现这个操作的目的是保证toHexString的入参一定是>=0x100的,也就是字符串长度一定是3。

疑问:byte & 0xFF的目的还有个没搞清楚的,就是这里还是byte得操作,怎么就要扩展为int了。找了些资料说系统检测到byte会转int就会先做扩展。感觉这个解释有些牵强。

你可能感兴趣的:(Integer.toHexString((byte & 0xFF) | 0x100).substring(1, 3))