为什么 base64 编码 java 代码这样做

why is the base64 encode java code doing this

所以我试图更好地理解 base64 编码,我在维基百科上看到了这个实现

private static String base64Encode(byte[] in)       {
        StringBuffer out = new StringBuffer((in.length * 4) / 3);
        int b;
        for (int i = 0; i < in.length; i += 3)  {
            b = (in[i] & 0xFC) >> 2;
            out.append(codes.charAt(b));
            b = (in[i] & 0x03) << 4;
            if (i + 1 < in.length)      {
                b |= (in[i + 1] & 0xF0) >> 4;
                out.append(codes.charAt(b));
                b = (in[i + 1] & 0x0F) << 2;
                if (i + 2 < in.length)  {
                    b |= (in[i + 2] & 0xC0) >> 6;
                    out.append(codes.charAt(b));
                    b = in[i + 2] & 0x3F;
                    out.append(codes.charAt(b));
                } else  {
                    out.append(codes.charAt(b));
                    out.append('=');
                }
            } else      {
                out.append(codes.charAt(b));
                out.append("==");
            }
        }

        return out.toString();
    }

我一直在跟进,然后我到了:

b = (in[i] & 0xFC) >> 2;

我不明白...为什么要将 bitwise252 转换为一个数字然后将其移动 right 2...这会不会一样如果您只是移动字节本身而不进行按位运算?示例:

b = in[i] >> 2; 

假设我的 in[i]letter e...表示为 101binary 01100101。如果我将 2 向右移动,我会得到 01100125。如果我按位 & 它我得到

01100101
11111100
--------
01100100

但是无论如何,轮班都会砍掉最后两个......那么为什么要这样做呢?

有人可以为我澄清一下吗?谢谢。

IN in[i] >> 2in[i] 首先转换为 int。如果它是一个负字节(设置了高位),它将被转换为一个负整数(也设置了现在最高的 24 位)。

(in[i] & 0xFC) >> 2中,in[i]如上所述转换为int,然后& 0xFC确保额外的位全部重置为0。

您说对了一部分,因为 (in[i] & 0xFF) >> 2 会给出相同的结果。 & 0xFF 是将字节转换为 0 到 255 范围内的非负数 int 的常用方法。

要确定原始开发人员为什么使用 0xFC 而不是 0xFF 的唯一方法是询问他们 - 但我推测这是为了让哪些位正在使用更明显用过。