C语言实现base64编码

原创 2016年08月31日 09:39:20
base64编码,基于C语言实现;
为了直观表现原理,使用位操作符实现;

base64编码原理:
每个字节都是由8位二进制组成,base64编码是将3个8位的字节转换成4个6位的base64码;
base64码表:

实现方式:
q=01110001
w=01110111
e=01100101
char buf[4]="qwe";

buf前三位的二进制编码为:
buf=01110001 01110111 01100101
    (q)    (w)     (e)

base64  b1,b2,b3,b4
b1=011100  = 28
b2=010111  = 23
b3=011101  = 29
b4=100101  = 37

对照base64码表:
b1=c
b2=X
b3=d
b4=l

如果源码buf的字节数不能被3整除会做如下处理:
一.如果余数是1,即buf最后有一个字节剩余,后两个字节会补0,形成24位二进制;但是后两个字节在编码的时候,会将它编译成 '=';
1. buf=00110000

b1=001100

b2=000000 因为第一个字节最后会剩下两个0 ,所以b2的实际编码是0;即base64表里面的 'A'

b3='='
b4='='
2. buf=00110001
b1=001100
b2=010000
b3='='
b4='='
二。如果余数是2,即buf最后有两个字节剩余:
1. buf=00110000 00000000
b1=001100
b2=000000  =='A'
b3=000000  =='A'

b4= '='


2. buf=00110001 00000100
b1=001100
b2=010000
b3=010000

b4= '='

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char Base[65]={};

void ch_to_base64(char src[])
{

        char dest[64]={};
        int s_len=strlen(src);
        int remainder = s_len%3;
        int times = (s_len-remainder)/3;
        int pos = 0;
        int i = 0,j = 0;
        int parr[5];
        while(times){
                unsigned int tmp1 = (unsigned int) src[pos++];
                unsigned int tmp2 = (unsigned int) src[pos++];
                unsigned int tmp3 = (unsigned int) src[pos++];
                parr[0] = tmp1>>2;
                parr[1] = ((tmp1-(tmp1>>2<<2))<<4) + (tmp2>>4);
                parr[2] = ((tmp2-(tmp2>>4<<4))<<2) +(tmp3>>6);
                parr[3] = tmp3-(tmp3>>6<<6);

                for(i,j=0;j<4;i++,j++){
                        dest[i] = Base[parr[j]];
                }
                times--;
        }
        if(remainder == 1){
                unsigned int re1 = (unsigned int)src[pos];
                if((re1&3) == 0) {
                    parr[0] = re1>>2;
                    dest[i++]=Base[parr[0]];
                    dest[i++]=Base[0];
                    dest[i++]='=';
                    dest[i++]='=';

                }else{
                    parr[0] = re1>>2;
                    parr[1] = (re1&3)<<4;
                    dest[i++]=Base[parr[0]];
                    dest[i++]=Base[parr[1]];
                    dest[i++]='=';
                    dest[i++]='=';
                }
        }
        if(remainder == 2){
                unsigned int re1 = (unsigned int)src[pos++];
                unsigned int re2 = (unsigned int)src[pos];
                if((re2&15) == 0){
                        parr[0] = re1>>2;
                        parr[1] = ((re1 - (re1>>2<<2))<<4) + (re2>>4);
                        dest[i++]=Base[parr[0]];
                        dest[i++]=Base[parr[1]];
                        dest[i++]=Base[0];
                        dest[i++]='=';
                }else{
                        parr[0] = re1>>2;
                        parr[1] = ((re1 - (re1>>2<<2))<<4) + (re2>>4);
                        parr[2] = (re2-(re2>>4<<4))<<2 ;
                        dest[i++] = Base[parr[0]];
                        dest[i++] = Base[parr[1]];
                        dest[i++] = Base[parr[2]];
                        dest[i++]='=';
                }
        }
        strcpy(src,dest);
}

int main(int argc,char **argv)
{
    strcpy(Base,"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");
    if(argc !=2) {
        printf("error: param num is wrong!\n");
        return -1;
    }
    ch_to_base64(argv[1]);
    printf("buf = %s\n",argv[1]);
}



版权声明:原创作品,喜欢点收藏 举报

相关文章推荐

Base64编码解码C语言实现

static const char *codes = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; ...

基于BASE64原理编码解码实现-----C语言

Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

base64 编码解码 c语言实现

#include #include #include char *base64_encode(const char *src); char *base64_decode(const char ...

base64编码算法与c语言实现

http://blog.163.com/lixiangqiu_9202/blog/static/5357503720140593058179/ 32位linux可用 base64是一种以64个可打印字...

Base64编码的C语言实现

本文转自http://blog.163.com/lixiangqiu_9202/blog/static/5357503720140593058179/ Bse64是一种以64个可打印字符对二进制数据...

Base64编码解码的实现(C语言)

base64编码解码的实现(C语言)  /**************************************************************** ...

C语言base64编码与解码

昨天工作中遇到需要将char *转换成base64的问题,把这块单独提取出来作为一个模块。 这里有几个参数需要解释一下: char *out:一块buffer的首地址,这块buffer就是用来存放...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)