主页 >
新闻资讯 >
软件开发资讯 >
C++编程C++软件开发 >
C语言实现base64编码
更新时间:2016-08-31 16:30
发布者:周老师
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]);
-
}
上一篇:
C# .net MVC 微信红包 下一篇:
给用户惊喜还是惊吓?做好APP的第一帧:启动页