解码十六进制:这条线做什么(len& 0x01)!= 0

时间:2014-08-26 07:41:03

标签: java

我正在浏览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;
    }

提前感谢。

3 个答案:

答案 0 :(得分:7)

检查len二进制文字中的最后一位数字是否为1

  xxxxxxxy
& 00000001
如果1y,则{p}提供1;如果0y则为0,忽略其他数字。

如果y1,则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只是十六进制表示法)