在加密代码中,经常看到类似Integer.toHexString(b[i] & 0xFF)这样的代码,那么这行代码到底是什么意思呢(b是一个byte[])?为什么要&0xFF呢?
- 这句代码的最终目的是把byte[]转换为16进制字符串
- toHexString()是把一个int转换为十六进制String
- & 0xFF是为了保证byte类型转int后其二进制的一致,即补零扩展。那么为什么要补零扩展呢?因为我们是要把每一个byte类型的数据都转换位16进制字符串,补零扩展的话就可以忽略前24位
- 对于正数,byte可以直接转int,但是当byte类型的数是负数时,就比较特殊了。
- int是32位,byte是8位,所以需要补位
- 负数在java中是以补码表示(可参考:java中负数的表示)
- byte是一个字节,最高位为符号位,则范围为[10000000,01111111],即[-128,127]。如:byte类型的-1是11111111
- 例:
byte类型的负数-12,java中表示:10001100
直接补位(补符号位扩展)的话:11111111 11111111 11111111 10001100
转换为16进制字符串结果:fffffff4
&0xFF的结果:00000000 00000000 00000000 10001100
转换为16进制字符串结果:f4
我想,看到这转为16进制的结果也应该明白为什么要&0xff了吧