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编码原理解析与Java实现

目前还在找工作,工作日时投投简历面面试,这周末难免就闲来无事了,那就只好看看慕课逛逛CSDN了,正巧看到一个关于Base64的课程《Java实现Base64加密》,点进去看看,完了发觉完全不是我想的那...
  • zdqdj1
  • zdqdj1
  • 2016年06月26日 00:39
  • 2456

base64编码原理及简单Python实现

廖老师的Python3教程中对base64编码的讲解讲得不是很清楚,我经过搜索和询问研究生同学,把一些有用的资料结合起来了,希望对你们有用。一、产生原因及作用用记事本打开exe、jpg、pdf这些文件...
  • sunflowerduidui
  • sunflowerduidui
  • 2016年05月31日 22:17
  • 1673

BASE64编码及SMTP协议简单实现

一个可以发送邮件的小demo,又可以做坏事了!!!
  • kyt511
  • kyt511
  • 2015年05月13日 22:56
  • 594

Base64编码的vbs实现

继续vbs的学习,顺便学习Base64。为了查汉字是以什么形式编码的花了半天时间~~       现在应该是挺完美的,有错误的话,麻烦指正。改日再写个解码的。 功能:把数据转成base64编码 ...
  • u013205484
  • u013205484
  • 2015年07月05日 21:49
  • 932

VB实现Base64 编解码

作者:iamlasong 一、编码规则     编码规则网上很多,为了文章的完整性,这里简单的叙述一下。Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码。它将需要编码的数...
  • iamlaosong
  • iamlaosong
  • 2014年07月28日 15:06
  • 7225

C++实现BASE64码编解码

原文:http://blog.csdn.net/chenxiaohua/archive/2009/04/16/4084602.aspx     #ifndef ___BASE64_H___ #defi...
  • hack_tian
  • hack_tian
  • 2017年06月18日 14:54
  • 654

用base64编码的字符串形式上传图片,并实时更新上传的进度条

刚做完项目里的上传图片并回调进度的需求,可谓一波三折,我就从我的开发过程中先后尝试的不同方法来总结下吧。先说下我们的需求:用base64编码上传图片,并实时更新上传的进度条。第一阶段: 由于我们项目...
  • u013168615
  • u013168615
  • 2015年12月24日 17:07
  • 4599

C语言base64编解码

– * icesongqiang* base64码简介百度词条Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的详细规范。...
  • u011491972
  • u011491972
  • 2016年10月12日 20:28
  • 1483

Base64加密解密算法的C/C++代码实现

// 头文件 base64.h #ifndef BASE64_H #define BASE64_H const char base[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZa...
  • tiandyoin
  • tiandyoin
  • 2014年06月14日 11:16
  • 10547

多种语言实现Base64编码解码

由于长度限制,上篇《网络信息传输编码解码》只介绍了编码解码的原理,本篇将把c#,vc,vb,delphi,php,python,asm 等语言的程序代码列于此,有些是从网上搜来的,供大家参考: ...
  • chinajobs
  • chinajobs
  • 2016年02月13日 13:35
  • 1203
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言实现base64编码
举报原因:
原因补充:

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