大概大多数代码都是清晰的,这里唯一让您感到困惑的是此表达式:
(bytes[i] & 0xff) + 0x100
第一部分:
bytes[i] & 0xff
加宽在位置字节
i到
int的比特位置8-31用零值。在Java中,
byte数据类型是带符号的整数值,因此加宽的符号会扩展该值。如果没有
&0xff,则大于0x7f的值最终将变为负值
int。剩下的就很明显了:它添加了0x100,它只是打开了索引8的位(因为它保证为0 in
(bytes[i] & 0xff)。然后
String通过调用转换为十六进制值)
Integer.toString(..., 16)。
首先添加0x100,然后剥离1(通过
substring(1)调用完成,它将子字符串从位置1到末尾开始)的原因是为了保证最终结果中的两个十六进制数字。否则,转换为十六进制时,低于0x10的字节值将以一个字符的字符串结尾。
是否所有性能都比以下更好(尚不清楚)尚有争议:
sb.append(String.format("%02x", bytes[i]));


