请选择 进入手机版 | 继续访问电脑版

C语言实现base64

// base64.c:
  1. #include <stdlib.h>  
  2. #include <string.h>  
  3. #include <stdio.h>

  4. #include "base64.h"

  5. const char *base64_table="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /* base64编码表 */

  6. static int num_strchr(const char *str, char c)
  7. {
  8.     const char *p = strchr(str, c);
  9.        
  10.     if (NULL == p)
  11.         {
  12.         return -1;
  13.     }
  14.        
  15.     return p - str;
  16. }

  17. unsigned int base64_get_dest_len(unsigned int src_len)
  18. {
  19.         return 4 * ((src_len+2)/3);  
  20. }

  21. unsigned int src_get_dest_len(unsigned int base64_len)
  22. {
  23.         return base64_len/4*3 - 2;  
  24. }

  25. int base64_encode(const unsigned char *src_str, unsigned int src_len, char *dest_str, unsigned int dest_len)
  26. {  
  27.     unsigned int i,len;   

  28.         len = base64_get_dest_len(src_len);

  29.         if(dest_len < len)
  30.         {/* 空间不足 */
  31.                 return -1;
  32.         }
  33.   
  34.     for(i=0; i<src_len/3; i++)  
  35.     {  
  36.         *dest_str++ =base64_table[(src_str[0]>>2) & 0x3f]; /* 取第一字符前6bit */  
  37.         *dest_str++ =base64_table[((src_str[0]<<4) & 0x30) | ((src_str[1]>>4) & 0x0f)]; /* 第一字符的后2bit与第二字符的前4位进行合并 */  
  38.         *dest_str++ =base64_table[((src_str[1]<<2) & 0x3c) | ((src_str[2]>>6) & 0x03)]; /* 将第二字符的后4bit与第三字符的前2bit组合并 */
  39.         *dest_str++ =base64_table[src_str[2] & 0x3f]; /* 取第三字符的后6bit */  
  40.         src_str += 3;
  41.     }  

  42.         /* 非3的整数倍补“=” */
  43.     if((src_len%3) == 1)  
  44.     {
  45.             *dest_str++ =base64_table[(src_str[0]>>2) & 0x3f];  
  46.         *dest_str++ =base64_table[((src_str[0]<<4) & 0x30) | ((src_str[1]>>4) & 0x0f)];
  47.         *dest_str++ ='=';  
  48.         *dest_str++ ='=';  
  49.            }
  50.         else if((src_len%3) == 2)   
  51.     {      
  52.             *dest_str++ =base64_table[(src_str[0]>>2) & 0x3f];  
  53.         *dest_str++ =base64_table[((src_str[0]<<4) & 0x30) | ((src_str[1]>>4) & 0x0f)];
  54.                 *dest_str++ =base64_table[(src_str[1]<<2) & 0x3c];
  55.             *dest_str++ ='=';   
  56.         }  
  57.           *dest_str = '\0';  
  58.        
  59.     return 0;  
  60. }

  61. int base64_decode(const unsigned char *src_str, unsigned int src_len, char *dest_str, unsigned int dest_len)
  62. {
  63.     unsigned int i = 0;
  64.     char buf[4] = {0};

  65.         if (dest_len < src_get_dest_len(src_len))
  66.         {
  67.                 return -1;
  68.         }
  69.        
  70.     for (; (src_str[i]!='\0') && (i<src_len); i+=4)
  71.         {
  72.         /* 四个码译成三个字符 */
  73.         buf[0] = num_strchr(base64_table, src_str[i]);
  74.         buf[1] = num_strchr(base64_table, src_str[i+1]);
  75.       
  76.         *dest_str++ = ((buf[0] << 2) & 0xfc) | ((buf[1]>>4) & 0x03);

  77.         if (src_str[i+2] == '=')
  78.                 {
  79.             break;
  80.         }
  81.         buf[2] = num_strchr(base64_table, src_str[i + 2]);
  82.       
  83.         *dest_str++ = ((buf[1] << 4) & 0xf0) | ((buf[2] >> 2) & 0x0f);

  84.         if (src_str[i + 3] == '=')
  85.                 {
  86.             break;
  87.         }
  88.         buf[3] = num_strchr(base64_table, src_str[i + 3]);

  89.         *dest_str++ = ((buf[2] << 6) & 0xc0) | (buf[3] & 0x3f);
  90.     }

  91.     *dest_str = '\0';

  92.     return 0;
  93. }

复制代码
// base64.h:
  1. #ifndef __BASE64_H__
  2. #define __BASE64_H__

  3. int base64_encode(const unsigned char *src_str, unsigned int src_len, char *dest_str, unsigned int dest_len);
  4. int base64_decode(const unsigned char *src_str, unsigned int src_len, char *dest_str, unsigned int dest_len);

  5. #endif

复制代码




标签: 暂无标签
Darkbright.Liu

写了 7 篇文章,拥有财富 129,被 2 人关注

转播转播 分享分享 分享淘帖
回复

使用道具

成为第一个吐槽的人

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

意见
反馈