C++实现base64编码

将昨天的php代码改造成C++

/*base_64.h文件*/
#ifndef BASE_64_H
#define BASE_64_H
/**
 * Base64 编码/解码
 * @author liruixing
 */
class Base64{
private:
    std::string _base64hash;
    int _encode_data;
    int _decode_data;
    int _width;
    bool _debug;
    std::string _encode_result,_decode_result;

    void _encode_func(int bin,int bytes = 3);
    void _decode_func(int bin,int bytes = 2);
public:
    Base64()
    {
        _base64hash = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /*这是Base64编码使用的标准字典*/
        _encode_data = 0xfc0000;
        _decode_data = 0xff0000;
        _width       = 0xffffff;
        _debug      = false;
    }
    /**
     * 这里必须是unsigned类型,否则编码中文的时候出错
     */
    std::string Encode(const unsigned char * str,int bytes);
    std::string Decode(const char *str,int bytes);
    void Debug(bool open = true);
};
#endif

上面定义了一个头文件,定义base64的类

/*base_64.cpp文件*/
#include <iostream>
#include <string>
#include <cstring>
#include "base_64.h"
void Base64::_encode_func(int bin,int bytes) {
        int num = 3,matches = 0,bits1=0,bits2=0,result=0;
        bits1 = (num - bytes) * 6;
            bits2 = bytes * 6;
            matches = _encode_data >> bits1;
        while( matches ) {
            result = bin & matches;
            result = result >> bits2;
            bytes--;
            bits1 = (num - bytes) * 6;
            bits2 = bytes * 6;
            matches = _encode_data >> bits1;
            if(_debug) {
                printf("result = %d , hex = %x\n",result,result);
            }
            _encode_result += _base64hash[result];
        }
    }

void Base64::_decode_func(int bin,int bytes) {
    int num = 2,matches = 0,bits1=0,bits2=0,result=0;
    bits1 = (num - bytes) * 8;
    bits2 = bytes * 8;
    matches = _decode_data >> bits1;
    while( matches ) {
        result = bin & matches;
        result = result >> bits2;
        bytes--;
        bits1 = (num - bytes) * 8;
        bits2 = bytes * 8;
        matches = _decode_data >> bits1;
        if(_debug) {
            printf("result = %d , hex = %x\n",result,result);
        }
        _decode_result += (char)result;
    }
}

std::string Base64::Encode(const unsigned char * str,int bytes) {
    int num = 0,bin = 0,i;
    if(bytes >= 3) {
        for(i=0;i<bytes;i++) {
            bin = bin << 8;
            if(_debug) {
                printf("bin = %d , hex = %x\n",bin,str[i]);
            }
            bin = bin | (int)str[i];
            if((i+1)%3 == 0) {
                _encode_func(bin,3);
                bin = 0;
            }
        }
    }
    if(bytes%3 == 1) {
        bin = (int)str[bytes-1];
        bin = bin << 4;
        _encode_func(bin,1);
        _encode_result += "==";
    } else if(bytes%3 == 2) {
        bin = (int)str[bytes-2];
        bin = bin << 8;
        bin = bin | (int)str[bytes-1];
        bin = bin << 2;
        _encode_func(bin,2);
        _encode_result += "=";
    }
    return _encode_result;
}
std::string Base64::Decode(const char *str,int bytes) {
    //解码表
    const char DecodeTable[] =
    {
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        62, // ‘+‘
        0, 0, 0,
        63, // ‘/‘
        52, 53, 54, 55, 56, 57, 58, 59, 60, 61, // ‘0‘-‘9‘
        0, 0, 0, 0, 0, 0, 0,
        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, // ‘A‘-‘Z‘
        0, 0, 0, 0, 0, 0,
        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, // ‘a‘-‘z‘
    };
    int bin = 0,i,pos=0;
    char *_decode_string = new char[bytes];
    strcpy(_decode_string,str);
    while(_decode_string[bytes-1] == ‘=‘)
    {
        _decode_string[bytes-1] = ‘\0‘;
        bytes--;
    }
    if(bytes >= 4) {
        for(i=0;i<bytes;i++) {
            bin = bin << 6;
            pos = DecodeTable[(int)_decode_string[i]];
            if(_debug) {
                printf("bin = %d , binary = %x-----ch = %c\n",bin,pos,_decode_string[i]);
            }
            bin = bin | pos;
            if((i+1)%4 == 0) {
                _decode_func(bin);
                bin = 0;
            }
        }
    }
    if(bytes%4 == 3) {
        bin = 0;
        if(_debug) {
            printf("bin = %x , ch = %c\n",bin, _decode_string[bytes-3]);
        }
        pos = DecodeTable[(int)_decode_string[bytes-3]];
        bin = bin | pos;
        bin = bin << 6;
        if(_debug) {
            printf("bin = %x , ch = %c\n",bin, _decode_string[bytes-2]);
        }
        pos = DecodeTable[(int)_decode_string[bytes-2]];
        bin = bin | pos;
        bin = bin << 6;
        if(_debug) {
            printf("bin = %x , ch = %c\n",bin, _decode_string[bytes-1]);
        }
        pos = DecodeTable[(int)_decode_string[bytes-1]];
        bin = bin | pos;
        if(_debug) {
            printf("bin = %x\n",bin);
        }
        bin = bin >> 2;
        _decode_func(bin,1);
    } else if(bytes%4 == 2) {
        bin = 0;
        if( _debug ) {
            printf("bin = %x , ch = %c\n",bin, _decode_string[bytes-2]);
        }
        pos = DecodeTable[(int)_decode_string[bytes-2]];
        bin = bin | pos;
        bin = bin << 6;
        if( _debug ) {
            printf("bin = %x , ch = %c\n",bin, _decode_string[bytes-1]);
        }
        pos = DecodeTable[(int)_decode_string[bytes-1]];
        bin = bin | pos;
        bin = bin >> 4;
        _decode_func(bin,0);
    }
    delete [] _decode_string;
    return _decode_result;
}
void Base64::Debug(bool open) {
    _debug = open;
}

base64类中方法的定义实际上是在base_64.cpp中进行的。

上面的两个文件用来生成一个静态链接库:libbase_64.a

g++ -c base_64.cpp
ar rs libbase_64.a base_64.o

下面来进行实际的测试:

/*main.cppe文件*/
#include <iostream>
#include "base_64.h"

using namespace std;
int main()
{
    unsigned char str[] = "这是一条测试数据:http://img.v.cmcm.com/7dd6e6d7-0c2d-5a58-a072-71f828b94cbc_crop_216x150.jpg";
    string normal,encoded;
    int i,len = sizeof(str)-1;
    Base64 *base = new Base64();
    encoded = base->Encode(str,len);
    cout << "base64 encode : " << encoded << endl;
    len = encoded.length();
    const char * str2 = encoded.c_str();
    normal = base->Decode(str2,len);
    cout << "base64 decode : " << normal <<endl;
    return 0;
}

编译代码并运行

g++ main.cpp -L. -lbase_64 -Ibase_64 -o main
./main

输出效果:

在改造昨天的php代码过程中,还参考了cnblogs上洞庭散人的代码实现的。

参考:

http://www.cnblogs.com/phinecos/archive/2008/10/10/1308272.html

时间: 2024-10-07 19:14:24

C++实现base64编码的相关文章

PHP_EOL换行 与 base64编码

base64编码包括64个字符:10个数字(0-9),26*2个字母(a-zA-Z),+,\ 其中还有一个第65个字符=作为后缀,没有实际作用. 来一段代码说明个问题: 1 <?php 2 3 $str = '1234567'; 4 5 $en = base64_encode($str);// MTIzNDU2Nw== 6 7 $en = 'MTIzND U 8 9 2Nw=========='; 10 11 echo base64_decode($en);// 1234567 可以看到,即使修

[C语言]Base64编码解码

Base64编码解码 一,Base64编码原理 Base64编码的字符数组如下所示 : ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ 字符串转Base64编码:取3字节的字符串转换为四字节的字符串,依次往后转换.得到Base64编码字符串.具体原理如下: 1,如果需要编码的原串字节数刚好为3的倍数,那么转换规则如下: 以中文字符'严'为例,'严'字的UTF-8编码为:0xE4B8A5 = 11100100  10

【前端攻略】:玩转图片Base64编码(转)

引言 图片处理在前端工作中可谓占据了很重要的一壁江山.而图片的Base64编码可能相对一些人而言比较陌生,本文不是从纯技术的角度去讨论图片的base64编码.标题略大,不过只是希望通过一些浅显的论述,让你知道什么是图片的base64编码,为什么我们要用它,我们如何使用并且方便的使用它,并让你懂得如何去在前端的实际工作中运用它. 什么是base64编码? 我不是来讲概念的,直接切入正题,图片的base64编码就是可以将一副图片数据编码成一串字符串,使用该字符串代替图像地址. 这样做有什么意义呢?我

JAVA 将图片转换为Base64编码

这里使用的jar包是commons-codec-1.10.jar; 示例代码 1 import java.io.FileInputStream; 2 import java.io.FileOutputStream; 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.io.OutputStream; 6 7 import org.apache.commons.codec.binary.Base64;

Base64编码字符串时数据量明显变大

那就是当把byte[]通过Convert.ToBase64String转换成Base64编码字符串时数据量明显变大 Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码.它将需要编码的数据拆分成字节数组.以3个字节为一组.按顺序排列24位数据,再把这24位数据分成4组,即每组6位.再在每组的的最高位前补两个0凑足一个字节.这样就把一个3字节为一组的数据重新编码成了4个字节.当所要编码的数据的字节数不是3的整倍数,也就是说在分组时最后一组不够3个字节.这时在最后一组填充1到

base64编码

Base64 is a group of similar binary-to-text encoding schemes that represent binary data in an ASCII string format by translating it into a radix-64 representation. Base64是一种用64个可打印字符来表示任意二进制数据的方法,不能用于加密. 为什么使用Base64格式编码? 在只支持纯文本的协议中需要保存非字符类数据(url(dat

base64编码加密图片和展示图片

base64是当前网络上最为常见的传输8Bit字节代码的编码方式其中之一.base64主要不是加密,它主要的用途是把某些二进制数转成普通字符用于 网络传输.由于这些二进制字符在传输协议中属于控制字符,不能直接传送,所以需要转换一下.虽然图片可能直接传输,但是我们也可以将它变成字符串直接放在 源码里,而不需要浏览器在读取到源码后再从服务器上下载.如何对图片进行base64编码 <?php $file = "./image/index.png"; $type = getimagesi

win api 实现 base64编码、解码

最近在写小玩意,用到了base64编码,但是考虑到体积大小,网上的多种实现都是利用开源的代码,这就增加了其大小.我想win api能不能实现base64编码.解码.通过一通乱搜,还有收获.就有了以下代码 #pragma comment(lib,"crypt32.lib") LPSTR Base64Encode(LPBYTE lpBuffer,DWORD dwLen) { DWORD dwNeed; LPSTR lpBase64Str ; DWORD dwIndex ; DWORD dw

base64编码理解

原文地址:http://www.ruanyifeng.com/blog/2008/06/base64.html 所谓Base64,就是说选出64个字符----小写字母a-z.大写字母A-Z.数字0-9.符号"+"."/"(再加上作为垫字的"=",实际上是65个字符)----作为一个基本字符集.然后,其他所有符号都转换成这个字符集中的字符. 具体来说,转换方式可以分为四步. 第一步,将每三个字节作为一组,一共是24个二进制位. 第二步,将这24个二

url、base64 编码规则

UrlEncode 相关: URI所允许的字符分作保留与未保留. 保留字符是那些具有特殊含义的字符. 例如, 斜线字符用于URL (或者更一般的, URI)不同部分的分界符. 未保留字符没有这些特殊含义. 百分号编码把保留字符表示为特殊字符序列. 上述情形随URI与URI的不同版本规格会有轻微的变化. RFC 3986 section 2.2 保留字符 (2005年1月) ! * ' ( ) ; : @ & = + $ , / ? # [ ] RFC 3986 section 2.3 未保留字符