C语言base64编码转码

 

 

一、最近,在做一个智能锁项目,锁上具有一个猫眼摄像头,当有客人来访时,需要通过猫眼抓拍图片上传到手机app端,让主人知道来访者是谁,项目中使用到了Base64编解码技术,所谓Base64编解码就是把每三个8bit的字节转换为四个6bit的字节(3*8 = 4*6 = 24),然后把6bit的字节再添两位高位0,组成四个8bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。例如:

转换前 11111111, 11111111, 11111111 (二进制)

转换后 00111111, 00111111, 00111111, 00111111 (二进制)

上面的三个字节是原文,下面的四个字节是转换后的Base64编码,其前两位均为0。Base64编码是使用64个可打印ASCII字符(A-Z、a-z、0-9、+、/)将任意字节序列数据编码成ASCII字符串,另有“=”符号用作后缀用途。 其中索引表如下图所示:

                                           

二、代码部分

Base64编码

const char * base64char  = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 
char * base64_encode( const unsigned char * originChar, char * base64, int originlength )//base64编码
{
    int i, j;
    unsigned char current;
 
    for ( i = 0, j = 0 ; i < originlength ; i += 3 )
    {
        current = (originChar[i] >> 2) ;
        current &= (unsigned char)0x3F;
        base64[j++] = base64char[(int)current];
 
        current = ( (unsigned char)(originChar[i] << 4 ) ) & ( (unsigned char)0x30 ) ;
        if ( i + 1 >= originlength )
        {
            base64[j++] = base64char[(int)current];
            base64[j++] = '=';
            base64[j++] = '=';
            break;
        }
        current |= ( (unsigned char)(originChar[i+1] >> 4) ) & ( (unsigned char) 0x0F );
        base64[j++] = base64char[(int)current];
 
        current = ( (unsigned char)(originChar[i+1] << 2) ) & ( (unsigned char)0x3C ) ;
        if ( i + 2 >= originlength )
        {
            base64[j++] = base64char[(int)current];
            base64[j++] = '=';
            break;
        }
        current |= ( (unsigned char)(originChar[i+2] >> 6) ) & ( (unsigned char) 0x03 );
        base64[j++] = base64char[(int)current];
 
        current = ( (unsigned char)originChar[i+2] ) & ( (unsigned char)0x3F ) ;
        base64[j++] = base64char[(int)current];
    }
    base64[j] = '\0';
    return base64;
}

 Base64解码部分

int base64_decode( const char * base64, unsigned char * originChar )//base64解码
{
    int i, j;
    unsigned char k;
    unsigned char temp[4];
    for ( i = 0, j = 0; base64[i] != '\0' ; i += 4 )
    {
        memset( temp, 0xFF, sizeof(temp) );
        for ( k = 0 ; k < 64 ; k ++ )
        {
            if ( base64char[k] == base64[i] )
                temp[0]= k;
        }
        for ( k = 0 ; k < 64 ; k ++ )
        {
            if ( base64char[k] == base64[i+1] )
                temp[1]= k;
        }
        for ( k = 0 ; k < 64 ; k ++ )
        {
            if ( base64char[k] == base64[i+2] )
                temp[2]= k;
        }
        for ( k = 0 ; k < 64 ; k ++ )
        {
            if ( base64char[k] == base64[i+3] )
                temp[3]= k;
        }
 
        originChar[j++] = ((unsigned char)(((unsigned char)(temp[0] << 2))&0xFC)) |
                ((unsigned char)((unsigned char)(temp[1]>>4)&0x03));
        if ( base64[i+2] == '=' )
            break;
 
        originChar[j++] = ((unsigned char)(((unsigned char)(temp[1] << 4))&0xF0)) |
                ((unsigned char)((unsigned char)(temp[2]>>2)&0x0F));
        if ( base64[i+3] == '=' )
            break;
 
        originChar[j++] = ((unsigned char)(((unsigned char)(temp[2] << 6))&0xF0)) |
                ((unsigned char)(temp[3]&0x3F));
    }
    return j;
}

 三、总结

Base64编码其实就是将二进制转成字符串,Base64解码其实就是将字符串转成二进制,文中顺便也提供了解码代码方便大家调用与交流,好了,最后提供两个编解码在线工具链接好方便大家论证:

https://base64.us/ 

http://tool.chinaz.com/tools/imgtobase

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章