Base-64(2)

main.cpp:

#include "stdafx.h"

#include "Base64.h"  

#include <iostream>  

using namespace std;

int main()
{
    unsigned long len = 10;

    unsigned char pIn[100];
    unsigned char pOut[100];

    memcpy(pIn, "你好", 5);

    string strout;

    cout << (char*)pIn << endl;
    if (CBase64::Encode(pIn, 4, strout))
        cout << strout << endl;
    else
        cout << "加密失敗" << endl;

    string stroIn = strout;
    cout << stroIn << endl;

    memset(pOut, 0, sizeof(pOut));

    if (CBase64::Decode(stroIn, pOut, &len))
    {
        cout << (char *)pOut << endl;
        cout << "len=" << strlen((char *)pOut) << endl;
    }
    else
        cout << "解密失敗" << endl;

    cout << len << endl;

    return 0;
}
Base64.cpp:
/*
*
*Base64?
*
*
*
*/
#include "stdafx.h"
#include "Base64.h"

static const char *g_pCodes =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

static const unsigned char g_pMap[256] =
{
    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
    255, 255, 255, 255, 255, 255, 255,  62, 255, 255, 255,  63,
    52,  53,  54,  55,  56,  57,  58,  59,  60,  61, 255, 255,
    255, 254, 255, 255, 255,   0,   1,   2,   3,   4,   5,   6,
    7,   8,   9,  10,  11,  12,  13,  14,  15,  16,  17,  18,
    19,  20,  21,  22,  23,  24,  25, 255, 255, 255, 255, 255,
    255,  26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,
    37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,  48,
    49,  50,  51, 255, 255, 255, 255, 255, 255, 255, 255, 255,
    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
    255, 255, 255, 255
};

CBase64::CBase64()
{
}

CBase64::~CBase64()
{
}

bool CBase64::Encode(const unsigned char *pIn, unsigned long uInLen, unsigned char *pOut, unsigned long *uOutLen)
{
    unsigned long i, len2, leven;
    unsigned char *p;

    if (pOut == NULL || *uOutLen == 0)
        return false;

    //ASSERT((pIn != NULL) && (uInLen != 0) && (pOut != NULL) && (uOutLen != NULL));

    len2 = ((uInLen + 2) / 3) << 2;
    if ((*uOutLen) < (len2 + 1)) return false;

    p = pOut;
    leven = 3 * (uInLen / 3);
    for (i = 0; i < leven; i += 3)
    {
        *p++ = g_pCodes[pIn[0] >> 2];
        *p++ = g_pCodes[((pIn[0] & 3) << 4) + (pIn[1] >> 4)];
        *p++ = g_pCodes[((pIn[1] & 0xf) << 2) + (pIn[2] >> 6)];
        *p++ = g_pCodes[pIn[2] & 0x3f];
        pIn += 3;
    }

    if (i < uInLen)
    {
        unsigned char a = pIn[0];
        unsigned char b = ((i + 1) < uInLen) ? pIn[1] : 0;
        unsigned char c = 0;

        *p++ = g_pCodes[a >> 2];
        *p++ = g_pCodes[((a & 3) << 4) + (b >> 4)];
        *p++ = ((i + 1) < uInLen) ? g_pCodes[((b & 0xf) << 2) + (c >> 6)] : '=';
        *p++ = '=';
    }

    *p = 0; // Append NULL byte
    *uOutLen = p - pOut;
    return true;
}

bool CBase64::Encode(const unsigned char *pIn, unsigned long uInLen, string& strOut)
{
    unsigned long i, len2, leven;
    strOut = "";

    //ASSERT((pIn != NULL) && (uInLen != 0) && (pOut != NULL) && (uOutLen != NULL));

    len2 = ((uInLen + 2) / 3) << 2;
    //if((*uOutLen) < (len2 + 1)) return false;

    //p = pOut;
    leven = 3 * (uInLen / 3);
    for (i = 0; i < leven; i += 3)
    {
        strOut += g_pCodes[pIn[0] >> 2];
        strOut += g_pCodes[((pIn[0] & 3) << 4) + (pIn[1] >> 4)];
        strOut += g_pCodes[((pIn[1] & 0xf) << 2) + (pIn[2] >> 6)];
        strOut += g_pCodes[pIn[2] & 0x3f];
        pIn += 3;
    }

    if (i < uInLen)
    {
        unsigned char a = pIn[0];
        unsigned char b = ((i + 1) < uInLen) ? pIn[1] : 0;
        unsigned char c = 0;

        strOut += g_pCodes[a >> 2];
        strOut += g_pCodes[((a & 3) << 4) + (b >> 4)];
        strOut += ((i + 1) < uInLen) ? g_pCodes[((b & 0xf) << 2) + (c >> 6)] : '=';
        strOut += '=';
    }

    //*p = 0; // Append NULL byte
    //*uOutLen = p - pOut;
    return true;
}

bool CBase64::Decode(const string& strIn, unsigned char *pOut, unsigned long *uOutLen)
{
    unsigned long t, x, y, z;
    unsigned char c;
    unsigned long g = 3;

    //ASSERT((pIn != NULL) && (uInLen != 0) && (pOut != NULL) && (uOutLen != NULL));

    for (x = y = z = t = 0; x < strIn.length(); x++)
    {
        c = g_pMap[strIn[x]];
        if (c == 255) continue;
        if (c == 254) { c = 0; g--; }

        t = (t << 6) | c;

        if (++y == 4)
        {
            if ((z + g) > *uOutLen) { return false; } // Buffer overflow
            pOut[z++] = (unsigned char)((t >> 16) & 255);
            if (g > 1) pOut[z++] = (unsigned char)((t >> 8) & 255);
            if (g > 2) pOut[z++] = (unsigned char)(t & 255);
            y = t = 0;
        }
    }

    *uOutLen = z;
    return true;
}

Base.h:
#pragma once
/**
* (C) Copyright 2009, asiainfo
* @version  v1.0
* @author   chenli
* @brief    base64編碼和解碼
*
* history:
* <p>chenli 2009-02-17 1.0 build this moudle</p>
*/

#ifndef ___BASE64_H___  
#define ___BASE64_H___  


#include <string>  

using namespace std;

class CBase64
{
public:
    CBase64();
    ~CBase64();

    /*********************************************************
    * 函數(shù)說明:將輸入數(shù)據(jù)進(jìn)行base64編碼
    * 參數(shù)說明:[in]pIn      需要進(jìn)行編碼的數(shù)據(jù)
    [in]uInLen  輸入?yún)?shù)的字節(jié)數(shù)
    [out]strOut 輸出的進(jìn)行base64編碼之后的字符串
    * 返回值  :true處理成功,false失敗
    * 作  者  :ChenLi
    * 編寫時(shí)間:2009-02-17
    **********************************************************/
    bool static Encode(const unsigned char *pIn, unsigned long uInLen, string& strOut);

    /*********************************************************
    * 函數(shù)說明:將輸入數(shù)據(jù)進(jìn)行base64編碼
    * 參數(shù)說明:[in]pIn          需要進(jìn)行編碼的數(shù)據(jù)
    [in]uInLen      輸入?yún)?shù)的字節(jié)數(shù)
    [out]pOut       輸出的進(jìn)行base64編碼之后的字符串
    [out]uOutLen    輸出的進(jìn)行base64編碼之后的字符串長度
    * 返回值  :true處理成功,false失敗
    * 作  者  :ChenLi
    * 編寫時(shí)間:2009-02-17
    **********************************************************/
    bool static Encode(const unsigned char *pIn, unsigned long uInLen, unsigned char *pOut, unsigned long *uOutLen);

    /*********************************************************
    * 函數(shù)說明:將輸入數(shù)據(jù)進(jìn)行base64解碼
    * 參數(shù)說明:[in]strIn        需要進(jìn)行解碼的數(shù)據(jù)
    [out]pOut       輸出解碼之后的節(jié)數(shù)數(shù)據(jù)
    [out]uOutLen    輸出的解碼之后的字節(jié)數(shù)長度
    * 返回值  :true處理成功,false失敗
    * 作  者  :ChenLi
    * 編寫時(shí)間:2009-02-17
    **********************************************************/
    bool static Decode(const string& strIn, unsigned char *pOut, unsigned long *uOutLen);

    /*********************************************************
    * 函數(shù)說明:將輸入數(shù)據(jù)進(jìn)行base64解碼
    * 參數(shù)說明:[in]strIn        需要進(jìn)行解碼的數(shù)據(jù)
    [out]pOut       輸出解碼之后的節(jié)數(shù)數(shù)據(jù)
    [out]uOutLen    輸出的解碼之后的字節(jié)數(shù)長度
    * 返回值  :true處理成功,false失敗
    * 作  者  :ChenLi
    * 編寫時(shí)間:2009-02-17
    **********************************************************/
    bool static Decode(const unsigned char *pIn, unsigned long uInLen, unsigned char *pOut, unsigned long *uOutLen);
};

#endif // ___BASE64_H___  

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末德玫,一起剝皮案震驚了整個(gè)濱河市昆淡,隨后出現(xiàn)的幾起案子啦桌,更是在濱河造成了極大的恐慌吏颖,老刑警劉巖愧沟,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丁恭,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)饰恕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門挠羔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人埋嵌,你說我怎么就攤上這事破加。” “怎么了雹嗦?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵范舀,是天一觀的道長。 經(jīng)常有香客問我了罪,道長锭环,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任泊藕,我火速辦了婚禮辅辩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘娃圆。我一直安慰自己玫锋,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布讼呢。 她就那樣靜靜地躺著景醇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吝岭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天吧寺,我揣著相機(jī)與錄音窜管,去河邊找鬼。 笑死稚机,一個(gè)胖子當(dāng)著我的面吹牛幕帆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赖条,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼失乾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了纬乍?” 一聲冷哼從身側(cè)響起碱茁,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎仿贬,沒想到半個(gè)月后纽竣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年蜓氨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了聋袋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡穴吹,死狀恐怖幽勒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情港令,我是刑警寧澤啥容,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站缠借,受9級特大地震影響干毅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜泼返,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一硝逢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绅喉,春花似錦渠鸽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至革屠,卻和暖如春凿试,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背似芝。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工那婉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人党瓮。 一個(gè)月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓详炬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親寞奸。 傳聞我的和親對象是個(gè)殘疾皇子呛谜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容