本帖最后由 not_a_baby 于 2010-10-02 15:12:40 编辑

解决方案 »

  1.   

    也不用看这个过程了。Base64 使用 64 个可显字符来转换二进制数据,可将二进制数据转换为可显字符数据。64 个字符就是 2^6,也就是需要使用 6 个二进制位来表示。二进制数据每个字节是 8 位的。因此向 Base64 转换的过程就是把 8 个字节位都拼在一起,然后再 6 个 6 个拆开来。
      

  2.   

    Base64很简单呀 就是取4位内存的01 然后用十六进制表示 11110000 = F0
      

  3.   


    描述有误,base64主要解决的问题是二进制数组与ascii字符串之间的相互转换,描述中提及的第一个、第二个、第三个字符的说法欠妥。手头没装Eclipse,用C#写了一段,经测试是正确的,比较罗嗦的是结尾部分的处理,欢迎高手拍砖
    private static String BASE64CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    static String base64Encode(byte[] bytes)
    {
        String dst = ""; //java编译器会优化字符串相加的操作,此处为可读性考虑,使用字符串相加进行字符连接并不会影响性能
        //每3个字节内容用4个字符存储,其位置关系如下
        //00000011 11112222 22333333
        for (int i = 0; i < bytes.Length; i += 3)
        {
            //第一个字节通过右移2位获得第一个目标字符的Base64表位置,根据这个数值取到表上相应的字符,就是第一个目标字符。
            dst += BASE64CHARS[bytes[i] >> 2];
            if (i + 2 < bytes.Length)
            {
                //然后将第一个字节左移4位加上第二个字节右移4位,即获得第二个目标字符。
                dst += BASE64CHARS[((bytes[i] & 0x03) << 4) + ((bytes[i + 1] & 0xf0) >> 4)];
                //再将第二个字节左移2位加上第三个字节右移6位,获得第三个目标字符。
                dst += BASE64CHARS[((bytes[i + 1] & 0x0f) << 2) + ((bytes[i + 2] & 0xc0) >> 6)];
                //最后取第三个字符的右6位即获得第四个目标字符。
                dst += BASE64CHARS[bytes[i + 2] & 0x3f];
            }
            else if (i + 1 < bytes.Length)
            {
                //然后将第一个字节左移4位加上第二个字节右移4位,即获得第二个目标字符。
                dst += BASE64CHARS[((bytes[i] & 0x03) << 4) + ((bytes[i + 1] & 0xf0) >> 4)];
                //再将第二个字节左移2位加上第三个字节右移6位,获得第三个目标字符。
                dst += BASE64CHARS[((bytes[i + 1] & 0x0f) << 2)];
                //最后取第三个字符的右6位即获得第四个目标字符。
                dst += BASE64CHARS[64];
            }
            else
            {
                //然后将第一个字节左移4位加上第二个字节右移4位,即获得第二个目标字符。
                dst += BASE64CHARS[((bytes[i] & 0x03) << 4)];
                //再将第二个字节左移2位加上第三个字节右移6位,获得第三个目标字符。
                dst += BASE64CHARS[64];
                //最后取第三个字符的右6位即获得第四个目标字符。
                dst += BASE64CHARS[64];
            }
        }
        return dst;
    }