base64编解码原理与函数

http://www.mxcz.net/tools/base64.aspx   在线转换工具
 
原因与原理:
早期邮件中都是明文 这在英语国家 并且没有附件的情况下是合适的 (那里网络还不是很普及 并且网络速度很慢)
但是后面随着internet的发展 人们希望传送除了英语以外的其它东西 如应用程序等同时其它国家也希望使用自己本国语言来写邮件
因此产生了对在邮件中传送二进制的要求
邮件的传送是以明文方式传送的
如果直接传送二进制 那邮全服务器可能会理解错 如把正文中内容错理解成指令(想想二进行中的\0等特殊字符) 所以发明了base64编码
使用64个可打印字符对内容进行编码
这64个字符是
"ABCDEFGHIJKLMNOPQRSTUVWX YZabcdefghijklmnopqrstuv wxyz0123456789+/"
编码原理是: 把3个字节使用上面的字母进行转换 转换成4个字节 每个字节都只有6bit
第一个字节由第一个byte的高6位组成
第二个字节的高位由第一个byte的低二位组成 低4位由第二个byte的高4位组成
第三个字节的高位由第二个byte的低四位组成 低2位由第三个字节的高2位组成
第四个字节是剩下的bit
Value Char Value Char Value Char Value Char
0 A 16 Q 32 g 48 w
1 B 17 R 33 h 49 x
2 C 18 S 34 i 50 y
3 D 19 T 35 j 51 z
4 E 20 U 36 k 52 0
5 F 21 V 37 l 53 1
6 G 22 W 38 m 54 2
7 H 23 X 39 n 55 3
8 I 24 Y 40 o 56 4
9 J 25 Z 41 p 57 5
10 K 26 a 42 q 58 6
11 L 27 b 43 r 59 7
12 M 28 c 44 s 60 8
13 N 29 d 45 t 61 9
14 O 30 e 46 u 62 +
15 P 31 f 47 v 63 /

自己可以直观的在纸上画 把18个bit平分成4份 就这样
下面是编码例子

/ encode base64 string
// return encode len
CODE


int Base64Enc(unsigned char *buf,const unsigned char*text,int size)
{
    static char *base64_encoding =
        "ABCDEFGHIJKLMNOPQRSTUVWX YZabcdefghijklmnopqrstuv wxyz0123456789+/";
    int buflen = 0;

    while(size>0){
        *buf++ = base64_encoding[ (text[0] >> 2 ) & 0x3f];
        if(size>2){
            *buf++ = base64_encoding[((text[0] & 3) << 4) | (text[1] >> 4)];
            *buf++ = base64_encoding[((text[1] & 0xF) << 2) | (text[2] >> 6)];
            *buf++ = base64_encoding[text[2] & 0x3F];
        }else{
            switch(size){
                case 1:
                    *buf++ = base64_encoding[(text[0] & 3) << 4 ];
                    *buf++ = '=';
                    *buf++ = '=';
                    break;
                case 2:
                    *buf++ = base64_encoding[((text[0] & 3) << 4) | (text[1] >> 4)];
                    *buf++ = base64_encoding[((text[1] & 0x0F) << 2) | (text[2] >> 6)];
                    *buf++ = '=';
                    break;
            }
        }

        text +=3;
        size -=3;
        buflen +=4;
    }

    *buf = 0;
    return buflen;
}

char GetBase64Value(char ch)
{
    if ((ch >= 'A') && (ch <= 'Z'))
        return ch - 'A';
    if ((ch >= 'a') && (ch <= 'z'))
        return ch - 'a' + 26;
    if ((ch >= '0') && (ch <= '9'))
        return ch - '0' + 52;
    switch (ch) {
        case '+':
            return 62;
        case '/':
            return 63;
        case '=':
            return 0;
        default:
            return 0;
    }
}


int Base64Dec(unsigned char *buf,const unsigned char*text,int size)
{
    if(size%4)
        return -1;
    unsigned char chunk[4];
    int parsenum=0;

    while(size>0){
        chunk[0] = GetBase64Value(text[0]);
        chunk[1] = GetBase64Value(text[1]);
        chunk[2] = GetBase64Value(text[2]);
        chunk[3] = GetBase64Value(text[3]);

        *buf++ = (chunk[0] << 2) | (chunk[1] >> 4);
        *buf++ = (chunk[1] << 4) | (chunk[2] >> 2);
        *buf++ = (chunk[2] << 6) | (chunk[3]);

        text+=4;
        size-=4;
        parsenum+=3;
    }

    return parsenum;
}

你可能感兴趣的:(base64编解码原理与函数)