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进制的数值进行操作

解决方案 »

  1.   

    BASE64字符表:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
    根据拆分后的6位2进制数找到相应的字符
      

  2.   

    呵呵,我是不明白((bytes[i] & 0xFC是什么意思
      

  3.   

    我也好像有点不明白,那直接用 bytes[i] >> 2 不可以吗?为什么还要与 0xfc 进行运算呢?
      

  4.   

    david2083 是否能解释一下?
      

  5.   

    不会吧,这也要讲究美观!据我理解可能为了保险,去掉更高的位,不过想想也不可能,byte 总共才 8 位。
      

  6.   

    //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);
      

  7.   

    to: sureyor直接使用 buf[0] = (byte)(b[i] >> 2); 不与 0xFC 运算,难道会出现问题?反正都右移掉了,跟 0 不 0 好像没有什么关系吧!
      

  8.   

    看来 hzcpig 说得挺有道理的。汗,不太使用位运算,总觉得使用位运算的人都是程序中的高手!!