日期:2014-05-20  浏览次数:20844 次

base64转码的简单问题,谢谢高手
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进制的数值进行操作

------解决方案--------------------
去掉不相关的二进制位
------解决方案--------------------
我也好像有点不明白,那直接用 bytes[i] > > 2 不可以吗?为什么还要与 0xfc 进行运算呢?
------解决方案--------------------
//0xFC对应的二进制是11111100, 意思就是取前6位(因为b[i]的后2位被0与掉了), > > 2表示右移2位, 即取前6位
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);
------解决方案--------------------
位操作有很大程度上取决于个人习惯问题,其实方法很多,但是一定要统一自己的位操作思想。

上述代码里面的位操作就很规范,每次都是先将不用的位置置0,然后位移得到需要的位,为了这个规范性,一点点操作上的重复是完全有必要的。