可对任意类型数据进行编码的Base64编解码源码

原创 2006年06月23日 12:51:00

// 测试平台: 在Win2K下的Cygwin gcc编译通过,测试没有发现问题(如果你发现了还请告诉我,谢谢!)
// 调用的库: strlen() (  其实可以自己写一个类似的功能函数来取长度的 )

/*
*********************************************************************************************************
*                                         昆明XXXX有限公司
*                                             技术研发部
*
*                                  (c) Copyright 2005-2006, kmajian
*                                        All Rights Reserved
*
*                                       Base-64的编解码程序文件
*
* File : BASE64.C
* By   : kmajian
* Date : 2006-6-23
*********************************************************************************************************
*/
#include "CONFIG.H"
#include "base64.h"

#define  CH_EMPTY                     0xFF
static const uint8 baseAlp[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
/*
*********************************************************************************************************
*                                              Base64编码
*
* 函数名称 : base64enc
* 功能描述 : 把特定内存块编码为Base64编码, 存入目的字符串
* 调用模块 : 无
* 参    数 : *sOut      目标字符缓冲区
*            *pIn       需要转变为Base64编码的内存块
*            iLen       内存块长度
* 返    回 : uint16     生成编码的长度
*********************************************************************************************************
*/
uint16 base64enc(void *pIn, uint16 iLen, char * sOut)
{
    uint8 *pBuf = ( uint8 * )pIn;
    uint8 swiBuf[ 4 ];
   
    uint16 i, n;
    uint16 iReturn = 0;
    uint16 iLenM3 = iLen % 3;
    uint16 iLenD3 = iLen / 3;
    uint16 iLenD3p;
   
    if( iLenM3 == 0 )                                 // 如果iLenM3等于0则iLenD3p就为iLenD3,否则为(iLenD3+1)
     iLenD3p = iLenD3;
    else
     iLenD3p = iLenD3;
   
    if( iLen < 1 )
    {
      return iReturn;
    }
   
    for( i = 0; i < iLenD3p; i++ )
    {
      swiBuf[ 0 ] = ( *pBuf ) >> 2;                   // 把第一个字符右移2位得到一个个目标字符
      swiBuf[ 1 ] = ( ( *pBuf ) << 4 ) & 0x30;        // 把第一个字符左移四位,然后与0x30相与,
                                                      // 得到第二个目标字符的第5、6位
      pBuf++;
      swiBuf[ 1 ] = swiBuf[ 1 ] + ( ( *pBuf ) >> 4 ); // 把第二个字符右移4位,然后与得到的目标5、6位相加
                                                      // 得到第二个目标字符
      swiBuf[ 2 ] = ( ( *pBuf ) << 2 ) & 0x3C;        // 把第二个字符左移2位,然后与0x3C相与,
                                                      // 得到第二个目标字符的第3、4、5、6位
      pBuf++;
      swiBuf[ 2 ] = swiBuf[ 2 ] + ( ( *pBuf ) >> 6 ); // 把第三个字符右移6位,然后与得到的目标3、4、5、6
                                                      // 位相加,得到第三个目标字符
      swiBuf[ 3 ] = ( *pBuf ) & 0x3F;                 // 第三个字符与0x3F相与,得到第四个目标字符
      pBuf++;
      for( n = 0; n < 4; n++ )                        // 取得需要的Base64编码
      {
        *sOut = baseAlp[ swiBuf[ n ] ];
        sOut++;
        iReturn++;
      }
    }
    switch( iLenM3 )                                  // 对不足三个字符的编码处理
    {
      case 1: swiBuf[ 0 ] = ( *pBuf ) >> 2;         
              swiBuf[ 1 ] = ( ( *pBuf ) << 4 ) & 0x30;
              swiBuf[ 2 ] = '=';
              swiBuf[ 3 ] = '=';
              for( n = 0; n < 4; n++ )
              {
                if( swiBuf[ n ] == '=' )
                {
                 *sOut = '=';
                }
                else
                {
                 *sOut = baseAlp[ swiBuf[ n ] ];
                }
                sOut++;
                iReturn++;
              }
              break;
      case 2: swiBuf[ 0 ] = ( *pBuf ) >> 2;         
              swiBuf[ 1 ] = ( ( *pBuf ) << 4 ) & 0x30;
              pBuf++;
              swiBuf[ 1 ] = swiBuf[ 1 ] + ( ( *pBuf ) >> 4 );
              swiBuf[ 2 ] = ( ( *pBuf ) << 2 ) & 0x3C;
              swiBuf[ 3 ] = '=';
              for( n = 0; n < 4; n++ )
              {
                if( swiBuf[ n ] == '=' )
                {
                 *sOut = '=';
                }
                else
                {
                 *sOut = baseAlp[ swiBuf[ n ] ];
                }
                sOut++;
                iReturn++;
              }
              break;
      default:break;
    }
   
    *sOut = '/0';
   
    return iReturn;
}

/*
*********************************************************************************************************
*                                              Base64解码
*
* 函数名称 : base64dec
* 功能描述 : 把送入的字符串按Base64方式解码, 存入目的缓冲区
* 调用模块 : 无
* 参    数 : *sIn       源字符串
*            *pOut      输出内存块
* 返    回 : uint16     解码后内容的长度
*********************************************************************************************************
*/
uint16 base64dec(const char *sIn, void * const pOut)
{
  uint8 *outBuf = ( uint8 * )pOut;
  uint8 cTemp;
  uint8 cBuf[ 3 ];
  uint16 iReturn = 0;
  uint16 i, n;
  uint16 cLen;
  uint16 aLen;
 
  cLen = strlen( sIn );
  if( ( cLen % 4 ) != 0 )
  {
   return iReturn;
  }
 
  aLen = cLen / 4;
  for( i = 0; i < aLen; i++ )
  {
   cTemp = GetB64Char( *sIn );
   sIn++;
   cBuf[ 0 ] = cTemp << 2;
   cTemp = GetB64Char( *sIn );
   sIn++;
   cBuf[ 0 ] = cBuf[ 0 ] + ( cTemp >> 4 );
   cBuf[ 1 ] = cTemp << 4;
   cTemp = GetB64Char( *sIn );
   sIn++;
   if( cTemp == CH_EMPTY )
   {
    *outBuf = cBuf[ 0 ];
    outBuf++;
    *outBuf = cBuf[ 1 ];
    iReturn = iReturn + 2;
    
    return iReturn;
   }
   else
   {
    cBuf[ 1 ] = cBuf[ 1 ] + ( cTemp >> 2 );
    cBuf[ 2 ] = cTemp << 6;
   }
   cTemp = GetB64Char( *sIn );
   sIn++;
   if( cTemp == CH_EMPTY )
   {
    *outBuf = cBuf[ 0 ];
    outBuf++;
    *outBuf = cBuf[ 1 ];
    outBuf++;
    *outBuf = cBuf[ 2 ];
    iReturn = iReturn + 3;
    
    return iReturn;
   }
   else
   {
    cBuf[ 2 ] = cBuf[ 2 ] + cTemp;
   }
   
   for( n = 0; n < 3; n++ )
   {
    *outBuf = cBuf[ n ];
    outBuf++;
    iReturn++;
   }
  }
   
  return iReturn;
}

// 获取Base64编码值
uint8 GetB64Char( const uint8 ch )
{
 uint8 n;
 
 if( ch == '=' )
 {
  return CH_EMPTY;
 }
 else
 {
  for( n = 0; n < strlen( baseAlp ); n++ )
  {
   if( ch == baseAlp[ n ] )
   {
    break;
   }
  }
  
  return n;
 }
}

/*
*********************************************************************************************************
*                                             END
*********************************************************************************************************
*/   

 

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
  • 826

如何利用openssl来进行base64编解码?

openssl的用法, 请见之前博文, 下面仅仅给出base64编解码的代码: #include #include #pragma comment(lib, "libeay32.lib") #p...
  • stpeace
  • stpeace
  • 2014年12月14日 16:13
  • 4751

Linux base64 --用base64编解码

用途说明 base64是一种常用的简单的编解码方式。以下内容摘自维基百科。   维基百科 Base64 写道 在MIME格式的电子邮件中,base64可以用来将binary的字节序列数据编码成...
  • mosesmo1989
  • mosesmo1989
  • 2016年04月08日 09:25
  • 743

Android Base64 编码/解码

Base64编码说明   Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式。 如果剩下的字符不足3个字节,则用...
  • u012964281
  • u012964281
  • 2014年10月24日 19:12
  • 7904

使用Base64编码对图片进行编码与显示

  • qq_16885135
  • qq_16885135
  • 2016年11月13日 10:01
  • 945

url编解码与base64编解码

最近做手Q的邀请功能,遇到一个坑,手Q结构化消息分享功能接口如下: /**  * @param scene 标识发送手Q会话或者Qzone  *         eQQScene.QQScene_QZ...
  • linxinfa
  • linxinfa
  • 2016年08月11日 23:40
  • 2726

android BASE64编码和解码一

今天在做Android项目的时候遇到一个问题,需求是向服务器上传一张图片,要求把图片转化成图片流放在 json字符串里传输。类似这样的: {“name”:”jike”,”age”:”20”,”pic”...
  • u010524035
  • u010524035
  • 2016年09月14日 11:14
  • 4899

boost库实现Base64编解码

boost库对Base64编解码进行很了很好的封装,以下代码用boost库实现Base64编解码 //boost库引用文件 #include #include #include //标准库 #i...
  • nk_wang
  • nk_wang
  • 2015年12月25日 23:32
  • 2159

Libb64:c/c++实现的base64编码解码库函数

base64编码解码本身也不复杂,但要自己写,还是得花点时间,如果能找到现成的可靠的代码,抄来最好,节省了测试的时间。 libb64就是实现base64编码解码的开源库,还提供了C++封装,用起来也...
  • 10km
  • 10km
  • 2016年03月31日 12:11
  • 3093

Java 8之BASE64编解码

一、基础Base64是一种用64个字符来表示任意二进制数据的方法。 用记事本打开exe、jpg、pdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符,所以,如果要让记...
  • u011179993
  • u011179993
  • 2016年06月27日 16:33
  • 2161
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:可对任意类型数据进行编码的Base64编解码源码
举报原因:
原因补充:

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