⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 base64 编解码演示程序.txt

📁 Base64 编解码演示程序
💻 TXT
字号:
/******************************************************************************
 * Base64 编/解码演示程序
 *
 * 编译环境:AIX
 * 作者:高宏伟(DukeJoe)
 * 地点:黑龙江省哈尔滨市平房区
 * 时间:2005-10-13 15:04
 * E-Mail : dukejoe@163.com
 * QQ : 21807822
 *****************************************************************************/
#include <stdio.h>

#define CRYPT_DEFAULT_BUFFER_LEN 1024

int RevertAlphabet(char *pValue) ;
int Base64Encode(char * pInfo, int iLength) ;
int Base64Decode(char * pInfo, int iLength) ;

int main()
{
 char szBuffer[CRYPT_DEFAULT_BUFFER_LEN] ;
 int  iLength ;
 
 memset(szBuffer, 0, sizeof(szBuffer)) ;
 strcpy(szBuffer, "大家好\r\n我是高宏伟") ;
 printf("original-->%s\n", szBuffer) ;
 /* 由于本程序的特定性,可以使用strlen来计算长度,其它长度最好是通过计算得到 */
 iLength = strlen(szBuffer) ;
 printf("iLength = %d\n", iLength) ;
 Base64Encode(szBuffer, iLength) ;
 printf("Encode-->%s\n", szBuffer) ;
 iLength = iLength%3 == 0 ? iLength/3*4 : (iLength/3+1)*4 ;
 Base64Decode(szBuffer, iLength) ;
 iLength = iLength/4*3 ;
 szBuffer[iLength] = '\0' ;
 printf("Decode-->%s\n", szBuffer) ;
 
 return 0 ;
}

int Base64Encode(char * pInfo, int iLength)
{
 char Alphabet[68] ;
 int i ;
 char cryptTemp[3] ;
 char szBuffer[CRYPT_DEFAULT_BUFFER_LEN] ;
 int iRemainder ;

 /* 初始化字母表 */
 for ( i = 0 ; i <= 25 ; i++ )
 {
  Alphabet[i] = 'A' + i ;
 }
 for ( i = 26 ; i <= 51 ; i++ )
 {
  Alphabet[i] = 'a' + i - 26 ;
 }
 for ( i = 52 ; i <= 61 ; i++ )
 {
  Alphabet[i] = '0' + i - 52 ;
 }
 Alphabet[62] = '+' ;
 Alphabet[63] = '/' ;
 Alphabet[64] = '=' ;
 Alphabet[65] = '\0' ;

 memset(szBuffer, 0, sizeof(szBuffer)) ;
 for ( i = 0 ; i < iLength/3 ; i++ )
 {
  szBuffer[i*4+0] = pInfo[i*3+0] >> 2 ;
  pInfo[i*3+0] = pInfo[i*3+0] & 0x03 ;
  szBuffer[i*4+0] = Alphabet[szBuffer[i*4+0]] ;
  /*printf("Encode::0x%X\n", szBuffer[i*4+0]) ;*/
  cryptTemp[1] = pInfo[i*3+1] >> 2 ;
  pInfo[i*3+1] = pInfo[i*3+1] & 0x0F ;
  szBuffer[i*4+1] = ((pInfo[i*3+0] << 6) | (0x3F & cryptTemp[1])) >> 2 ;
  szBuffer[i*4+1] = Alphabet[szBuffer[i*4+1]] ;
  /*printf("Encode::0x%X\n", szBuffer[i*4+1]) ;*/
  pInfo[i*3+1] = (pInfo[i*3+1] & 0x0F) << 2 ;
  cryptTemp[2] = pInfo[i*3+2] & 0xC0 ;
  szBuffer[i*4+2] = pInfo[i*3+1] | (cryptTemp[2] >> 6) & 0x3F ;
  szBuffer[i*4+2] = Alphabet[szBuffer[i*4+2]] ;
  /*printf("Encode::0x%X\n", szBuffer[i*4+2]) ;*/
  szBuffer[i*4+3] = pInfo[i*3+2] & 0x3F ;
  szBuffer[i*4+3] = Alphabet[szBuffer[i*4+3]] ;
  /*printf("Encode::0x%X\n", szBuffer[i*4+3]) ;*/
 }
 iRemainder = iLength%3 ;
 i = iLength/3 ;
 if ( iRemainder == 1 )
 {
  szBuffer[i*4+0] = pInfo[i*3+0] >> 2 ;
  pInfo[i*3+0] = pInfo[i*3+0] & 0x03 ;
  szBuffer[i*4+0] = Alphabet[szBuffer[i*4+0]] ;
  /*printf("Encode::0x%X\n", szBuffer[i*4+0]) ;*/
  szBuffer[i*4+1] = pInfo[i*3+0] << 4 ;
  szBuffer[i*4+1] = Alphabet[szBuffer[i*4+1]] ;
  /*printf("Encode::0x%X\n", szBuffer[i*4+1]) ;*/
  szBuffer[i*4+2] = '=' ;
  /*printf("Encode::0x%X\n", szBuffer[i*4+2]) ;*/
  szBuffer[i*4+3] = '=' ;
  /*printf("Encode::0x%X\n", szBuffer[i*4+3]) ;*/
 }
 else if ( iRemainder == 2 )
 {
  szBuffer[i*4+0] = pInfo[i*3+0] >> 2 ;
  pInfo[i*3+0] = pInfo[i*3+0] & 0x03 ;
  szBuffer[i*4+0] = Alphabet[szBuffer[i*4+0]] ;
  /*printf("Encode::0x%X\n", szBuffer[i*4+0]) ;*/
  cryptTemp[1] = pInfo[i*3+1] >> 2 ;
  pInfo[i*3+1] = pInfo[i*3+1] & 0x0F ;
  szBuffer[i*4+1] = ((pInfo[i*3+0] << 6) | (0x3F & cryptTemp[1])) >> 2 ;
  szBuffer[i*4+1] = Alphabet[szBuffer[i*4+1]] ;
  /*printf("Encode::0x%X\n", szBuffer[i*4+1]) ;*/
  pInfo[i*3+1] = (pInfo[i*3+1] & 0x0F) << 2 ;
  cryptTemp[2] = pInfo[i*3+2] & 0xC0 ;
  szBuffer[i*4+2] = pInfo[i*3+1] | (cryptTemp[2] >> 6) & 0x3F ;
  szBuffer[i*4+2] = Alphabet[szBuffer[i*4+2]] ;
  /*printf("Encode::0x%X\n", szBuffer[i*4+2]) ;*/
  szBuffer[i*4+3] = '=' ;
  /*printf("Encode::0x%X\n", szBuffer[i*4+3]) ;*/
 }

 /*strncpy(pInfo, szBuffer, iLength) ;*/
 memcpy(pInfo, szBuffer, iLength%3 == 0 ? iLength/3*4 : (iLength/3+1)*4) ;

 return 0 ;
}

int Base64Decode(char * pInfo, int iLength)
{
 int i ;
 char cryptTemp[3] ;
 char szBuffer[CRYPT_DEFAULT_BUFFER_LEN] ;

 memset(szBuffer, 0, sizeof(szBuffer)) ;
 for ( i = 0 ; i < iLength/4 ; i++ )
 {
  RevertAlphabet(pInfo+i*4+3) ;
  RevertAlphabet(pInfo+i*4+2) ;
  cryptTemp[2] = pInfo[i*4+2] & 0x03 ;
  cryptTemp[2] = (cryptTemp[2] << 6) & 0xC0 ;
  szBuffer[i*3+2] = cryptTemp[2] | pInfo[i*4+3] ;
  /*printf("Decode::0x%x\n", szBuffer[i*3+2]) ;*/
  RevertAlphabet(pInfo+i*4+1) ;
  cryptTemp[1] = (pInfo[i*4+2] & 0x3C) >> 2 ;
  szBuffer[i*3+1] = ((pInfo[i*4+1] & 0x0F) << 4) | cryptTemp[1] ;
  /*printf("Decode::0x%x\n", szBuffer[i*3+1]) ;*/
  RevertAlphabet(pInfo+i*4+0) ;
  szBuffer[i*3+0] = (pInfo[i*4+0] << 2) | ((pInfo[i*4+1] >> 4) & 0x03) ;
  /*printf("Decode::0x%x\n", szBuffer[i*3+0]) ;*/
 }

 memcpy(pInfo, szBuffer, iLength/4*3) ;

 return 0 ;
}

int RevertAlphabet(char *pValue)
{
 if ((*pValue >= 'A') && (*pValue <= 'Z'))
  *pValue = *pValue - 'A' ;
 else if ((*pValue >= 'a') && (*pValue <= 'z'))
  *pValue = *pValue - 'a' + 26 ;
 else if ((*pValue >= '0') && (*pValue <= '9'))
  *pValue = *pValue - '0' + 52 ;
 else if ( *pValue == '+' )
  *pValue = 62 ;
 else if ( *pValue == '/' )
  *pValue = 63 ;
 else if ( *pValue == '=' )
  *pValue = 0 ;
 else
  *pValue = -1 ;

 return 0 ;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -