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();

    /*********************************************************
    * 函数说明:将输入数据进行base64编码
    * 参数说明:[in]pIn      需要进行编码的数据
    [in]uInLen  输入参数的字节数
    [out]strOut 输出的进行base64编码之后的字符串
    * 返回值  :true处理成功,false失败
    * 作  者  :ChenLi
    * 编写时间:2009-02-17
    **********************************************************/
    bool static Encode(const unsigned char *pIn, unsigned long uInLen, string& strOut);

    /*********************************************************
    * 函数说明:将输入数据进行base64编码
    * 参数说明:[in]pIn          需要进行编码的数据
    [in]uInLen      输入参数的字节数
    [out]pOut       输出的进行base64编码之后的字符串
    [out]uOutLen    输出的进行base64编码之后的字符串长度
    * 返回值  :true处理成功,false失败
    * 作  者  :ChenLi
    * 编写时间:2009-02-17
    **********************************************************/
    bool static Encode(const unsigned char *pIn, unsigned long uInLen, unsigned char *pOut, unsigned long *uOutLen);

    /*********************************************************
    * 函数说明:将输入数据进行base64解码
    * 参数说明:[in]strIn        需要进行解码的数据
    [out]pOut       输出解码之后的节数数据
    [out]uOutLen    输出的解码之后的字节数长度
    * 返回值  :true处理成功,false失败
    * 作  者  :ChenLi
    * 编写时间:2009-02-17
    **********************************************************/
    bool static Decode(const string& strIn, unsigned char *pOut, unsigned long *uOutLen);

    /*********************************************************
    * 函数说明:将输入数据进行base64解码
    * 参数说明:[in]strIn        需要进行解码的数据
    [out]pOut       输出解码之后的节数数据
    [out]uOutLen    输出的解码之后的字节数长度
    * 返回值  :true处理成功,false失败
    * 作  者  :ChenLi
    * 编写时间:2009-02-17
    **********************************************************/
    bool static Decode(const unsigned char *pIn, unsigned long uInLen, unsigned char *pOut, unsigned long *uOutLen);
};

#endif // ___BASE64_H___  

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容