C语言实现base64编码

主页 > 新闻资讯 > 软件开发资讯 > C++编程C++软件开发 >

C语言实现base64编码

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= '='

代码:

 

[cpp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4.   
  5. char Base[65]={};  
  6.   
  7. void ch_to_base64(char src[])  
  8. {  
  9.   
  10.         char dest[64]={};  
  11.         int s_len=strlen(src);  
  12.         int remainder = s_len%3;  
  13.         int times = (s_len-remainder)/3;  
  14.         int pos = 0;  
  15.         int i = 0,j = 0;  
  16.         int parr[5];  
  17.         while(times){  
  18.                 unsigned int tmp1 = (unsigned int) src[pos++];  
  19.                 unsigned int tmp2 = (unsigned int) src[pos++];  
  20.                 unsigned int tmp3 = (unsigned int) src[pos++];  
  21.                 parr[0] = tmp1>>2;  
  22.                 parr[1] = ((tmp1-(tmp1>>2<<2))<<4) + (tmp2>>4);  
  23.                 parr[2] = ((tmp2-(tmp2>>4<<4))<<2) +(tmp3>>6);  
  24.                 parr[3] = tmp3-(tmp3>>6<<6);  
  25.   
  26.                 for(i,j=0;j<4;i++,j++){  
  27.                         dest[i] = Base[parr[j]];  
  28.                 }  
  29.                 times--;  
  30.         }  
  31.         if(remainder == 1){  
  32.                 unsigned int re1 = (unsigned int)src[pos];  
  33.                 if((re1&3) == 0) {  
  34.                     parr[0] = re1>>2;  
  35.                     dest[i++]=Base[parr[0]];  
  36.                     dest[i++]=Base[0];  
  37.                     dest[i++]='=';  
  38.                     dest[i++]='=';  
  39.   
  40.                 }else{  
  41.                     parr[0] = re1>>2;  
  42.                     parr[1] = (re1&3)<<4;  
  43.                     dest[i++]=Base[parr[0]];  
  44.                     dest[i++]=Base[parr[1]];  
  45.                     dest[i++]='=';  
  46.                     dest[i++]='=';  
  47.                 }  
  48.         }  
  49.         if(remainder == 2){  
  50.                 unsigned int re1 = (unsigned int)src[pos++];  
  51.                 unsigned int re2 = (unsigned int)src[pos];  
  52.                 if((re2&15) == 0){  
  53.                         parr[0] = re1>>2;  
  54.                         parr[1] = ((re1 - (re1>>2<<2))<<4) + (re2>>4);  
  55.                         dest[i++]=Base[parr[0]];  
  56.                         dest[i++]=Base[parr[1]];  
  57.                         dest[i++]=Base[0];  
  58.                         dest[i++]='=';  
  59.                 }else{  
  60.                         parr[0] = re1>>2;  
  61.                         parr[1] = ((re1 - (re1>>2<<2))<<4) + (re2>>4);  
  62.                         parr[2] = (re2-(re2>>4<<4))<<2 ;  
  63.                         dest[i++] = Base[parr[0]];  
  64.                         dest[i++] = Base[parr[1]];  
  65.                         dest[i++] = Base[parr[2]];  
  66.                         dest[i++]='=';  
  67.                 }  
  68.         }  
  69.         strcpy(src,dest);  
  70. }  
  71.   
  72. int main(int argc,char **argv)  
  73. {  
  74.     strcpy(Base,"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");  
  75.     if(argc !=2) {  
  76.         printf("error: param num is wrong!\n");  
  77.         return -1;  
  78.     }  
  79.     ch_to_base64(argv[1]);  
  80.     printf("buf = %s\n",argv[1]);  
  81. }  



上一篇: C# .net MVC 微信红包   下一篇:给用户惊喜还是惊吓?做好APP的第一帧:启动页