?? base64.cpp
字號(hào):
/*
Copyright 2006 - 2008
ZhangLuduo <zhangluduo@msn.com>
All Rights Reserved.
Base64 編碼及解碼
作者 - 張魯奪(zhangluduo)
MSN - zhangluduo@msn.com
QQ群 - 34064264
為所有愛我的人和我愛的人努力!
*/
#include "stdAfx.h"
#include "Base64.h"
#define for if ( 0 ) ; else for
Base64::Base64()
{
//編碼表
m_EncodeTable = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
// 建立解碼表.
for( int i = 0; i < 256; i++ )
m_DecodeTable[i] = -1; // 非法數(shù)字.
for( int i = 0; i < 64; i++ )
{
m_DecodeTable[ m_EncodeTable[ i ] ] = i;
m_DecodeTable[ m_EncodeTable[ i ] | 0x80 ] = i; // 忽略8th bit.
m_DecodeTable[ '=' ] = -1;
m_DecodeTable[ '=' | 0x80 ] = -1;
}
}
Base64::~Base64()
{
}
void Base64::EncodeInput1(/* in */const unsigned char pData[1], /* out */char EncodeBuf[4])
{
EncodeBuf[0] = m_EncodeTable[(pData[0] & 0xFC) >> 2];
EncodeBuf[1] = m_EncodeTable[((pData[0] & 0x03) << 4)];
EncodeBuf[2] = '=';
EncodeBuf[3] = '=';
}
void Base64::EncodeInput2(/* in */const unsigned char pData[2], /* out */char EncodeBuf[4])
{
EncodeBuf[0] = m_EncodeTable[(pData[0] & 0xFC) >> 2];
EncodeBuf[1] = m_EncodeTable[((pData[0] & 0x03) << 4) | ((pData[1] & 0xF0) >> 4)];
EncodeBuf[2] = m_EncodeTable[((pData[1] & 0x0F) << 2)];
EncodeBuf[3] = '=';
}
void Base64::EncodeInput3(/* in */const unsigned char pData[3], /* out */char EncodeBuf[4])
{
EncodeBuf[0] = m_EncodeTable[pData[0] >> 2];
EncodeBuf[1] = m_EncodeTable[((pData[0] << 4) | (pData[1] >> 4)) & 0x3F];
EncodeBuf[2] = m_EncodeTable[((pData[1] << 2) | (pData[2] >> 6)) & 0x3F];
EncodeBuf[3] = m_EncodeTable[pData[2] & 0x3F];
}
string Base64::Encode(unsigned char* pData, int DataLen)
{
string strEncode = "";
char EncodeBuf[5] = { 0 };
unsigned char ch[3] = { 0 };
int LineLen = 0;
for(int i = 0 ; i < (int)(DataLen / 3); i++)
{
ch[0] = *pData ++;
ch[1] = *pData ++;
ch[2] = *pData ++;
EncodeInput3(ch, EncodeBuf);
strEncode += EncodeBuf;
if(LineLen += 4, LineLen == 76)
{
strEncode += "\r\n";
LineLen = 0;
}
}
//對(duì)剩余數(shù)據(jù)進(jìn)行編碼
int Mod = DataLen % 3;
if(Mod == 1)
{
memset(EncodeBuf, 0, 5);
ch[0] = *pData++;
EncodeInput1(ch, EncodeBuf);
strEncode += EncodeBuf;
}
else if(Mod == 2)
{
memset(EncodeBuf, 0, 5);
ch[0] = *pData++;
ch[1] = *pData++;
EncodeInput2(ch, EncodeBuf);
strEncode += EncodeBuf;
}
return strEncode;
}
// char Base64::GetDecodeChar(char ch)
// {
// if ((ch >= 'A') && (ch <= 'Z'))
// return ch - 'A';
// else if ((ch >= 'a') && (ch <= 'z'))
// return ch - 'a' + 26;
// else if ((ch >= '0') && (ch <= '9'))
// return ch - '0' + 52;
// switch (ch)
// {
// case '+':
// return 62;
// case '/':
// return 63;
// case '=': // base64 padding
// return 0;
// default:
// return 0;
// }
// }
string Base64::Decode(unsigned char* pData, int DataLen, int* nByte)
{
if(nByte != 0)
*nByte = 0;
string strDecode = "";
int nValue = 0;
int i = 0;
while (i < DataLen)
{
if (*pData != '\r' && *pData != '\n')
{
nValue = m_DecodeTable[*pData ++] << 18;
nValue += m_DecodeTable[*pData ++] << 12;
// nValue = GetDecodeChar(*pData ++) << 18;
// nValue += GetDecodeChar(*pData ++) << 12;
strDecode +=(nValue & 0x00FF0000) >> 16;
if(nByte != 0)
++ (*nByte);
if (*pData != '=')
{
nValue += m_DecodeTable[*pData++] << 6;
//nValue += GetDecodeChar(*pData++) << 6;
strDecode += (nValue & 0x0000FF00) >> 8;
if(nByte != 0)
++ (*nByte);
if (*pData != '=')
{
nValue += m_DecodeTable[*pData++];
// nValue += GetDecodeChar(*pData++);
strDecode += nValue & 0x000000FF;
if(nByte != 0)
++ (*nByte);
}
}
i += 4;
}
else // 回車換行,跳過
{
pData ++;
i ++;
}
}
return strDecode;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -