#include <string>

using namespace std;



class ZBase64

{

public:

    /*编码

    DataByte

        [in]输入的数据长度,以字节为单位

    */

    string Encode(const unsigned char* Data,int DataByte);

    /*解码

    DataByte

        [in]输入的数据长度,以字节为单位

    OutByte

        [out]输出的数据长度,以字节为单位,请不要通过返回值计算

        输出数据的长度

    */

    string Decode(const char* Data,int DataByte,int& OutByte);

};

#include "stdAfx.h"

#include "ZBase64.h"



string ZBase64::Encode(const unsigned char* Data,int DataByte)

{

    //编码表

    const char EncodeTable[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    //返回值

    string strEncode;

    unsigned ]={};

    ;

    ;i<();i++)

    {

        Tmp[] = *Data++;

        Tmp[] = *Data++;

        Tmp[] = *Data++;

        strEncode+= EncodeTable[Tmp[] >> ];

        strEncode+= EncodeTable[((Tmp[] << ) | (Tmp[] >> )) & 0x3F];

        strEncode+= EncodeTable[((Tmp[] << ) | (Tmp[] >> )) & 0x3F];

        strEncode+= EncodeTable[Tmp[] & 0x3F];

        ,LineLength==) {strEncode+=;}

    }

    //对剩余数据进行编码

    ;

    )

    {

        Tmp[] = *Data++;

        strEncode+= EncodeTable[(Tmp[] & ];

        strEncode+= EncodeTable[((Tmp[] & )];

        strEncode+= "==";

    }

    )

    {

        Tmp[] = *Data++;

        Tmp[] = *Data++;

        strEncode+= EncodeTable[(Tmp[] & ];

        strEncode+= EncodeTable[((Tmp[] & ) | ((Tmp[] & )];

        strEncode+= EncodeTable[((Tmp[] & )];

        strEncode+= "=";

    }

    

    return strEncode;

}



string ZBase64::Decode(const char* Data,int DataByte,int& OutByte)

{

    //解码表

    const char DecodeTable[] =

    {

        , , , , , , , , , , , , , , , , , , , , , , , ,

        , , , , , , , , , , , , , , , , , , ,

        , // '+'

        , , ,

        , // '/'

        , , , , , , , , , , // '0'-'9'

        , , , , , , ,

        , , , , , , , , , , , , ,

        , , , , , , , , , , , , , // 'A'-'Z'

        , , , , , ,

        , , , , , , , , , , , , ,

        , , , , , , , , , , , , , // 'a'-'z'

    };

    //返回值

    string strDecode;

    int nValue;

    ;

    while (i < DataByte)

    {

        if (*Data != '\r' && *Data!='\n')

        {

            nValue = DecodeTable[*Data++] << ;

            nValue += DecodeTable[*Data++] << ;

            strDecode+=(nValue & ;

            OutByte++;

            if (*Data != '=')

            {

                nValue += DecodeTable[*Data++] << ;

                strDecode+=(nValue & ;

                OutByte++;

                if (*Data != '=')

                {

                    nValue += DecodeTable[*Data++];

                    strDecode+=nValue & 0x000000FF;

                    OutByte++;

                }

            }

            i += ;

        }

        else// 回车换行,跳过

        {

            Data++;

            i++;

        }

     }

    return strDecode;

}

使用示例(结合CxImage库):

CString CScanDlg::EncodeImage()

{//对图片进行Base64编码

    ZBase64 zBase;

    //图片编码

    CxImage  image;   // 定义一个CxImage对象    

    image.Load(this->m_strImgPath, CXIMAGE_FORMAT_JPG);   //先装载jpg文件,需要指定文件类型

    ;//得到图像大小

    BYTE* buffer=;//存储图像数据的缓冲

    image.Encode(buffer,size,CXIMAGE_FORMAT_JPG);//把image对象中的图像以type类型数据copy到buffer

    string strTmpResult=zBase.Encode(buffer,size);

    CString result;

    result = strTmpResult.c_str();

    return result;

}

void CScanDlg::DecodeImageData(CString strData)

{//对Base64编码过的数据解码并显示原图片



    ZBase64 zBase;

    ;

    string strTmpResult=zBase.Decode(strData,strData.GetLength(),OutByte);

    int i,len = strTmpResult.length();

    BYTE *buffer = new BYTE[len];

    ;i<len;++i)

    {

        buffer[i] = strTmpResult[i];

    }

    CxImage image(buffer,len,CXIMAGE_FORMAT_JPG);//把内存缓冲buffer中的数据构造成Image对象

    delete [] buffer;

    CDC* hdc = m_picture.GetDC();

    m_bitmap = image.MakeBitmap(hdc->m_hDC);

    HBITMAP h0ldBmp = m_picture.SetBitmap(m_bitmap);

    if(h0ldBmp) DeleteObject(h0ldBmp);

    if(hdc->m_hDC) m_picture.ReleaseDC(hdc);

    if(m_bitmap) DeleteObject(m_bitmap);

}

作者:洞庭散人

出处:http://phinecos.cnblogs.com/    

本博客遵从Creative Commons Attribution 3.0 License,若用于非商业目的,您可以自由转载,但请保留原作者信息和文章链接URL。

Base64编解码(C++版)的更多相关文章

  1. python3的base64编解码

    使用python3的base64编解码实现字符串的简易加密解密 引言: 在一些项目中,接口的报文是通过base64加密传输的,所以在进行接口自动化时,需要对所传的参数进行base64编码,对拿到的响应 ...

  2. Delphi Base64 编解码函数

    Delphi 自带 Base64 编解码的单元, EncdDecd这个单元提供两套四个公开函数: 对流的编解码:procedure EncodeStream(Input, Output: TStrea ...

  3. ios Base64编解码工具类及使用

    为了避免明码传递http内容,可以用base64编码后传输,收到方再解码,也方便了2进制数据的字符串式传输. 对于ios来说,google给提供了一个很好的工具类,方便进行base64编解码,当然也可 ...

  4. Java实现BASE64编解码

    Java实现BASE64编解码 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs BASE64和其它类似的编码算法通经常使用于转换二进制数据为文本数据,其目 ...

  5. Delphi 自带的 Base64 编解码函数

    今天帮别人解决一个关于 Base64 编解码的问题,竟然发现 Delphi 自带了 Base64 编解码的单元,叫 EncdDecd,这名字很拗口而且不直观,估计这是一直很少人关注和知道的原因. 这个 ...

  6. openssl命令行Base64编解码

    openssl对base64编解码的规范支持较差,用它编解码的结果别的语言如php处理很不方便,注意的几点整理如下 1,如果php加密结果做base64编码长度小于64,则需要添加一个换行符opens ...

  7. python rsa 加密解密 (编解码,base64编解码)

    最近有需求,需要研究一下RSA加密解密安全:在网上百度了一下例子文章,很少有文章介绍怎么保存.传输.打印加密后的文本信息,都是千篇一律的.直接在一个脚本,加密后的文本信息赋于变量,然后立马调用解密.仔 ...

  8. python base64 编解码,转换成Opencv,PIL.Image图片格式

    二进制打开图片文件,base64编解码,转成Opencv格式: # coding: utf-8 import base64 import numpy as np import cv2 img_file ...

  9. EasyDarwin开源流媒体云平台中boost Base64编解码后与源长度不匹配的bug

    本文转自EasyDarwin团队Alex的博客:http://blog.csdn.net/cai6811376 EasyDarwin云平台中部分协议使用了Base64编码昨晚报文通信的载体.比如在对摄 ...

随机推荐

  1. WebBrowser自动点击链接 广告自动点击 Ads Auto Click

    点击付费广告, 是目前比较流行的一种网络营销模式, 但是,如果你单纯的靠手工一个一个去点, 总觉得不划算  , 能不能实现自动的去点击呢? 答案是肯定的 .NET 里面的 WebBrowser, 可以 ...

  2. zlib用法说明

    1. 如何获得zlib zlib的主页是:http://www.zlib.net/ 2. 用VC++6.0打开 把 下载的源代码解压打开,VC6.0的工程已经建好了,在\projects\visual ...

  3. POJ 3185 The Water Bowls (高斯消元 求最小步数)

    题目链接 题意:有20个数字,0或1.如果改变一个数的状态,它左右两边的两个数的状态也会变反.问从目标状态到全0,至少需要多少次操作. 分析: 和上一题差不多,但是比上一题还简单,不多说了,但是在做题 ...

  4. MemSQL Start[c]UP 2.0 - Round 1 B. 4-point polyline (线段的 枚举)

    昨天cf做的不好,居然挂零了,还是1点开始的呢.,,, a题少了一个条件,没判断长度. 写一下B题吧 题目链接 题意: 给出(n, m),可以得到一个矩形 让你依次连接矩形内的4个点使它们的长度和最长 ...

  5. 函数buf_page_init

    /********************************************************************//** Inits a page to the buffer ...

  6. bzoj2241: [SDOI2011]打地鼠

    暴力. O(n^6)暴力卡过,72ms. 莫名其妙做这道题时感觉十分烦躁,难受,只能这样了. O(n^4)的方法是这样差分一下.判断的时候tmp=t[i][j],t[i][j]-=tmp,t[i+r] ...

  7. ASP.NET MVC ActionResult的实现

    1.11种ActionResult 在System.Web.Mvc命名空间下: ActionResult是一个抽象类, 在Action中返回的都是其派生类.下面是我整理的ASP.NET MVC 1.0 ...

  8. Deferred的那些知识

    在移动开发中的各种中,我们一定会遇到异步回调的问题,比如: 1:Css3执行动画完毕, 回调 2:Jquery Animate动画的执行完毕, 回调 3:Ajax的执行(并行.串行),回调 等等   ...

  9. 02day2

    油滴扩展 [问题描述] 在一个长方形框子里,最多有 N(0≤N≤6)个相异的点.在其中任何-个点上放一个很小的油滴,那么这个油滴会一直扩展,直到接触到其他油滴或者框子的边界.必须等一个油滴扩展完毕才能 ...

  10. 【C#学习笔记】调用C++生成的DLL

    首先用vs2010建立win32项目,选择dll和空项目. 头文件add.h extern "C" __declspec(dllexport) int add(int a,int ...