#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. PHP的线程安全与非线程安全版本的区别

    Windows版的PHP从版本5.2.1开始有Thread Safe(线程安全)和None Thread Safe(NTS,非线程安全)之分,这两者不同在于何处?到底应该用哪种?这里做一个简单的介绍. ...

  2. javascript中===与==

    == equality 等同,=== identity 恒等. ==, 两边值类型不同的时候,要先进行类型转换,再比较. ===,不做类型转换,类型不同的一定不等. 类型转换规则:Boolean> ...

  3. NDK(17)让ndk支持完整C++,exception,rtti,

    C++ Support The Android platform provides a very minimal C++ runtime support library (/system/lib/li ...

  4. html5 touch事件实现触屏页面上下滑动(二)

    五一小长假哪都没去,睡了三天,今天晕晕沉沉的投入工作了,但还是做出了一点点效果 上周用html5的touch事件把简单的滑动做出来了,实现了持续页面上下滑动的效果,参考之前 的文章及代码html5 t ...

  5. eclipse的安装

    eclipse的安装只要记住一条就好,那就是eclipse安装的时候版本要一致(就是,安装eclipse 32位的,同时要配套jdk 32位,tomcat 32位的),同理64位的也是一样的. 本人安 ...

  6. Myeclipse多行注释快捷键及其他快捷键

    当时我看到struts2讲解视频的时候,讲解员居然能一下子注释掉好几行代码,而且注释的很整齐,然我大吃一惊,上网搜了下Myeclipse的快捷键还真多 选择你要注释的那一行或多行代码,按Ctrl+/即 ...

  7. DataGridView控件的使用---添加行

    最简单的方法 可以静态绑定数据源,这样就自动为DataGridView控件添加相应的行. 假如需要动态为DataGridView控件添加新行,方法有很多种,下面简单介绍如何为DataGridView控 ...

  8. git branch

    使用git管理工具,branch 应该是我们接触最多的.不论我们是修复bug,还是做项目,都会新开branch,工作完成后再合并. 然而对一些初学者,对git的一些命令知之甚少,这里,给大家写一些常用 ...

  9. 基于XMPP的即时通信系统的建立(二)— XMPP详解

    XMPP详解 XMPP(eXtensible Messaging and Presence Protocol,可扩展消息处理和现场协议)是一种在两个地点间传递小型结构化数据的协议.在此基础上,XMPP ...

  10. FileZilla无法确定拖放操作的目标,由于shell未正确安装

    天有不测风云,突然间,用filezilla下载ftp上的文件到桌面的时候,提示"无法确定拖放操作目标.由于shell未正确安装" 解决办法很简单,执行如下几步就OK了 1.在CMD ...