?? 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 + -