#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. 用maven进行测试

    maven的重要职责之一就是自动运行单元测试,它通过maven-surefire-plugin与主流的单元测试框架junit和testng集成,并且能够自动生成丰富的结果报表. maven并不是一个单 ...

  2. IOS基础框架

    GameKit 为游戏提供网络功能:点对点互联和游戏中的语音交流 AddressBook 提供访问用户联系人信息的功能 AddressBookUI 提供一个用户界面,用于显示存储在地址簿中的联系人信息 ...

  3. chrome浏览器无法设置打开特定网页

    最近chrome浏览器更新后,发现以前设置的启动浏览器“重上次停下的地方继续”功能消失了. 当我点击设置网页时,会出现如上提示. 后来有同事给了如下一个连接,里面说到这个是公司的超级管理员搞的,他定义 ...

  4. linux/unix网络编程之epoll

    转载自 Linux epoll模型 ,这篇文章讲的非常详细! 定义: epoll是Linux内核为处理大批句柄而作改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显 ...

  5. hdu 4952 Number Transformation (找规律)

    题目链接 题意:给你个x,k次操作,对于第i次操作是:要找个nx,使得nx是>=x的最小值,且能整除i,求k次操作后的数 分析: 经过打表找规律,会发现最后的x/i,这个倍数会趋于一个固定的值, ...

  6. hdu 3501 Calculation 2 (欧拉函数)

    题目 题意:求小于n并且 和n不互质的数的总和. 思路:求小于n并且与n互质的数的和为:n*phi[n]/2 . 若a和n互质,n-a必定也和n互质(a<n).也就是说num必定为偶数.其中互质 ...

  7. QQ在线图标 离线 QQ开通在线QQ服务 QQ陌生人直接聊天

           如图  永远都显示离线,即使QQ在线也显示离线的原因和解决方法   1:打开 这个页面  提示你开通  你就点击一下开通  这样头像就可以正常显示 离线 和在线了 http://wp.q ...

  8. Android基础_2 Activity线性布局和表格布局

    在activity的布局中,线性布局和表格布局是最简单的,这次分别从线性布局,表格布局以及线性布局和表格混合布局做了实验,实验中只需要编写 相应的xml的代码,java代码不需要更改,因为我们这里只是 ...

  9. unsigned 和 signed

    http://www.cnblogs.com/stonehat/archive/2011/10/14/2212141.html http://m.blog.csdn.net/blog/u0100862 ...

  10. 入门视频采集与处理(学会分析YUV数据)

    做视频采集与处理,自然少不了要学会分析YUV数据.因为从采集的角度来说,一般的视频采集芯片输出的码流一般都是YUV数据流的形式,而从视频处理(例如H.264.MPEG视频编解码)的角度来说,也是在原始 ...