Java 解码十六进制:这行做什么(len&;0x01)!=0

Java 解码十六进制:这行做什么(len&;0x01)!=0,java,Java,我正在浏览ApacheCommons库中的一段代码,我想知道这些条件到底起什么作用 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 Dec

我正在浏览ApacheCommons库中的一段代码,我想知道这些条件到底起什么作用

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;
    }
公共静态字节[]decodeHex(最终字符[]数据)抛出decodeXception{
最终整数长度=data.length;
如果((len&0x01)!=0){//这个条件做什么
抛出新的DecoderException(“奇数字符”);
}
最终字节[]输出=新字节[len>>1];
//两个字符构成十六进制值。
对于(int i=0,j=0;jint f=toDigit(数据[j],j)这检查
len
二进制写入中的最后一位是否为
1

  xxxxxxxy
& 00000001
如果
y
1
,则给出
1
0
如果
y
0
,忽略其他数字

如果
y
1
,字符数组的长度是奇数,这在十六进制写入中不应该发生,因此出现异常

另一个解决办法是

if (len%2 != 0) {
在我看来,这会更清楚。我怀疑在循环真正重要之前性能的轻微提高。

这是一种(高性能)编码方式:

if (len % 2 == 1)
i、 e.是
len
奇数。它之所以有效,是因为每个奇数整数的二进制表示都有其最低有效位(即最后一位)。使用
1
按位执行
会屏蔽所有其他位,如果是奇数,则结果为
1
,如果是偶数,则结果为
0

这是C语言的一个遗留版本,您可以简单地编写代码:

if (len & 1)

此行检查len是否为奇数。
如果len不是奇数,len&1将等于0。(1和0x01是相同的值,0x01只是十六进制表示法)

谢谢你,现在有意义了。但是第二部分发生了什么?(byte)(f&0xFF)。它会检查f是否为255位长吗?因为后面有对byte的转换,我真的不明白为什么会有这个
&0xFF