buf[0] = (byte) ((bytes[i] & 0xFC) >> 2);
buf[1] = (byte) (((bytes[i] & 0x03) << 4) | ((bytes[i + 1] & 0xF0) >> 4));
buf[2] = (byte) (((bytes[i + 1] & 0x0F) << 2) | ((bytes[i + 2] & 0xC0) >> 6));
buf[3] = (byte) (bytes[i + 2] & 0x3F);××××××××××××××为什么要和0xFC做&操作呢 ,下面又是0x03资料中这样说:
第一个字符通过右移2位获得第一个目标字符的Base64表位置,根据这个数值取到表上相应的字符,就是第一个目标字符。
然后将第一个字符左移4位加上第二个字符右移4位,即获得第二个目标字符。
再将第二个字符左移2位加上第三个字符右移6位,获得第三个目标字符。
最后取第三个字符的右6位即获得第四个目标字符。看不懂代码中为什么要和16进制的数值进行操作
buf[1] = (byte) (((bytes[i] & 0x03) << 4) | ((bytes[i + 1] & 0xF0) >> 4));
buf[2] = (byte) (((bytes[i + 1] & 0x0F) << 2) | ((bytes[i + 2] & 0xC0) >> 6));
buf[3] = (byte) (bytes[i + 2] & 0x3F);××××××××××××××为什么要和0xFC做&操作呢 ,下面又是0x03资料中这样说:
第一个字符通过右移2位获得第一个目标字符的Base64表位置,根据这个数值取到表上相应的字符,就是第一个目标字符。
然后将第一个字符左移4位加上第二个字符右移4位,即获得第二个目标字符。
再将第二个字符左移2位加上第三个字符右移6位,获得第三个目标字符。
最后取第三个字符的右6位即获得第四个目标字符。看不懂代码中为什么要和16进制的数值进行操作
根据拆分后的6位2进制数找到相应的字符
buf[0] = (byte)((b[i] & 0xFC) >> 2);
//0x03对应的二进制是00000011, 即留前一个字符b[i]的后2位, 要左移4位, 以便给下4位留个地方;
0xF0对应的二进制是11110000, 取当前数的前4位作为6位数的后4位, 所以利用>>4, 和前一个数的后2位结合就是共6位了*/
buf[1] = (byte)(((b[i] & 0x03) << 4) | ((b[i+1] & 0xF0) >> 4));
//类似上面的, 取bytes[i+1]后4位作为高4位, 取bytes[i+2]前2为作为低2位
buf[2] = (byte)(((b[i+1] & 0x0F) << 2) | ((b[i+2] & 0xC0) >> 6));
//最后的低6位作为最后的6位
buf[3] = (byte)( b[i+2] & 0x3F);