我正在浏览Apache commons库中的一段代码,并想知道这些条件究竟是做什么的。
public static byte[] decodeHex(final char[] data) throws DecoderException {
final int len = data.length;
if ((len & 0x01) != 0) { // what does this condition do
throw new DecoderException("Odd number of characters.");
}
final byte[] out = new byte[len >> 1];
// two characters form the hex value.
for (int i = 0, j = 0; j < len; i++) {
int f = toDigit(data[j], j) << 4;
j++;
f = f | toDigit(data[j], j);
j++;
out[i] = (byte) (f & 0xFF); // what is happening here.
}
return out;
}
提前感谢。
答案 0 :(得分:7)
检查len
二进制文字中的最后一位数字是否为1
。
xxxxxxxy
& 00000001
如果1
为y
,则{p}提供1
;如果0
为y
则为0
,忽略其他数字。
如果y
为1
,则char数组的长度为奇数,这不应该在此十六进制写入中发生,因此例外。
另一种解决方案是
if (len%2 != 0) {
在我看来会更清楚。我怀疑在循环真正重要之前的性能略有提升。
答案 1 :(得分:3)
这是一种1337(高性能)编码方式:
if (len % 2 == 1)
即。是len
奇数。它的工作原理是因为每个奇数的二进制表示都设置了最低有效位(即最后一位)。使用AND
执行按位1
会屏蔽所有其他位,如果它是奇数则会留下1
的结果,如果是偶数则留下0
。
这是来自C的遗留物,您只需编码:
if (len & 1)
答案 2 :(得分:0)
此行检查len是否为奇数。 如果len不是奇数,len&amp; 1将等于0.(1和0x01是相同的值,0x01只是十六进制表示法)