`
hcmfys
  • 浏览: 357579 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

c++ base64

 
阅读更多


/*
* base64.h
*
*  Created on: 2013-1-15
*      Author: hcmfys@163.com
*/
#ifndef _BASE_64_H_
#define _BASE_64_H_
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
using namespace std;
#ifndef OUT
#define OUT
#endif
#ifndef IN
#define IN
#endif

class Base64
{
public:
    Base64()
    {
       base_table ="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    }
    int base64_decode(IN const char*code,OUT string &result)
    {
        int len=strlen(code);
        int size=len /4;
        if(len % 4 !=0)
        {
            cout<<"error data format\n";
            return -1;
        }
        int alloc_size=len /4 *3;

        char *buffer=new char[alloc_size+1];
        memset(buffer,0,alloc_size+1);
        int q=0;
        for(int i=0; i<size; i++)
        {
            unsigned char p0=(unsigned char)code[4*i];
            unsigned char p1=(unsigned char)code[4*i+1];
            unsigned char p2=(unsigned char)code[4*i+2];
            unsigned char p3=(unsigned char)code[4*i+3];
            int s1=get_index(p0);
            if(s1==-1)
            {
                cout<<"error data format\n";
                return -1;
            }
            int s2=get_index(p1);
            if(s2==-1)
            {
                cout<<"error data format\n";
                return -1;
            }
            int s3=-2;
            int s4=-2;
            if(p2 =='=')
            {
                if(p3 != '=')
                {
                    cout<<"error data format\n";
                    return -1;
                }
                s3=-2;
            }
            else
            {
                s3=get_index(p2);
                if(s3==-1)
                {
                    cout<<"error data format\n";
                    return -1;
                }
            }

            if(p3=='=')
            {
                s4=-2;
            }
            else
            {
                s4=get_index(p3);
                if(s4==-1)
                {
                    cout<<"error data format\n";
                    return -1;
                }
            }

            if(s3==-2)
            {
                s2=s2 >>4;
                buffer[q]=(s1 << 2) | s2;
            }
            else
            {
                //前面前6位和中间2位
                buffer[q]=( s1<< 2 ) | ( s2 >> 4 );
                q++;
                if(s4==-2)
                {
                    s3=s3 >>2;
                    int low=	(s2 & 0xf ) << 4;
                    buffer[q]= low | s3;
                }
                else
                {
                    //前面前4位和中间4位
                    int low=(s2 & 0xf)<< 4 ;
                    int high=s3 >> 2;
                    buffer[q]= low | high;
                    q++;
                    //中间后2位和最后6位
                    low=(s3 & 0x03) << 6;
                    buffer[q]=low | s4;
                    q++;
                }
            }

        }
        result=buffer;
		alloc_size=strlen(buffer);
        delete[] buffer;
        return alloc_size;
    }


    int base64_encode(IN const  char* code, OUT string &result)
    {
        int len = strlen(code);

        int size = len / 3;
        int allocat_size=size*4  ;
        int index = 0;
        for (int i = 0; i < size; i++)
        {
            //前6位
            unsigned char p0=(unsigned char)code[index];
            unsigned char p1=(unsigned char)code[index+1];
            unsigned char p2=(unsigned char)code[index+2];
            int cur_index = p0>> 2;
            result += base_table[cur_index];
            //前2位中间4位
            cur_index = ((p0 & 0x03) << 4) | (p1>> 4);
            result += base_table[cur_index];
            //中间后4位和最后前2位
            cur_index = ((p1 & 0xf) << 2) | (p2 >> 6);
            result += base_table[cur_index];
            //最后6位
            cur_index = (p2 & 0x3f);
            result += base_table[cur_index];
            index += 3;
        }
        size =  3-len * 4 % 3 ;
        switch(size)
        {
        case 1:
        {

            unsigned char p0=(unsigned char)code[index];
            unsigned char p1=(unsigned char)code[index+1];
            //前6位
            int cur_index = (p0 >> 2 & 0x3f);
            result += base_table[cur_index];
            //前后2位和中间4位
            int high = (p0 & 0x03) << 4;
            int low = p1 >> 4 & 0x0f;
            cur_index = high | low;
            result += base_table[cur_index];
            //最后4位补1个 00 位
            high = p1<< 4 & 0xf0;
            high=high>>2;
            cur_index=high;
            result += base_table[cur_index];
            //填充一个 = 号
            result += "=";
            allocat_size+=4;
        }
        break;
        case 2:
        {
            unsigned char p0=(unsigned char)code[index];
            //前6位
            int cur_index = (p0>> 2 & 0x3f);
            result += base_table[cur_index];
            //前4位补充 2个 00 位
            cur_index = p0 & 0x03;
            cur_index = cur_index << 4;
            result += base_table[cur_index];
            result += "=";
            result += "=";
            allocat_size+=4;
        }
        break;
        default:
            break;
        }
        return allocat_size;

    }
private:
      char  *base_table   ;

    int get_index(char l)
    {
        for(int i=0; i<64; i++)
        {
            if(base_table[i]==l)
                return i;
        }
        return -1;
    }

   
};

#endif







分享到:
评论

相关推荐

    一个C++Base64编解码库(源码)

    这个压缩包提供了一个C++实现的Base64编解码库,由一位外国开发者编写。以下是对这个库的一些详细知识点的解析: 1. **Base64编码原理**:Base64编码将每3个8位字节(24位)的数据块转换为4个6位字节(24位)的数据...

    C/C++ Base64编解码开源库

    在C/C++中,处理Base64编解码通常需要自定义函数或者利用开源库。这个开源库提供了解决这个问题的方法。 1. **Base64编码原理** - Base64编码是将每3个字节(24位)的数据转换为4个6位的字符(每个字符对应Base64...

    c++ base64 编码工具

    在C++中实现Base64编码和解码是常见的需求,尤其在处理图像、文件或其他二进制数据时。下面我们将详细探讨Base64的原理以及如何在C++中实现。 Base64编码的基本思想是将每3个8位字节(24位)的数据转换为4个6位字节...

    封装的C++BASE64工具

    在这个场景下,我们讨论的是一个C++封装的BASE64工具,它为开发者提供了方便的接口来处理BASE64编码和解码任务,尤其适用于网络通信。 首先,让我们深入了解BASE64编码的基本原理。BASE64使用64个字符(包含大小写...

    c++ base64 编码

    C++作为一门通用的编程语言,也支持Base64的编码和解码操作。下面我们将详细探讨C++实现Base64编码的相关知识点。 首先,Base64的基本原理是将每3个字节(24位)的数据转换为4个Base64字符(每个字符6位),总共32...

    C++ BASE64 编解码

    **C++ BASE64 编解码** 在计算机科学中,Base64是一种用于将二进制数据编码为ASCII字符的编码方式,广泛应用于电子邮件、HTTP传输和其他需要将二进制数据转换为纯文本格式的场景。Base64编码通过将每3个8位字节(24...

    c++ base64加密解密源码

    在你提供的资源中,“c++ base64加密解密源码”包含了Base64编码和解码功能的实现,这对理解Base64的工作原理以及如何在C++中实现它非常有帮助。 Base64的基本原理是将每3个8位字节的数据块(24位)转换为4个6位的...

    c\c++base64

    在这个压缩包中,我们有一个名为"Base64Demo"的项目,它包含了一个C/C++实现的Base64编码和解码类,适用于Visual Studio 2008编译环境。 Base64编码原理: 1. 将任意3个字节的数据(24位)分为4组,每组6位。 2. 对...

    C++ Base 64 编码解码

    在C++中实现Base64的编码和解码通常涉及到字符串处理、位操作以及字符映射表等技术。下面将详细介绍Base64编码解码的工作原理以及如何在Visual Studio 2008环境下编写C++程序来实现这一功能。 一、Base64编码原理 ...

    c++图片 base64互转

    在C++编程中,处理图片数据时,我们可能需要将图片转换为Base64编码,或者将Base64编码还原回原始图片。下面将详细介绍这个过程中的关键知识点。 首先,我们需要理解Base64编码的工作原理。Base64使用64个字符...

    C++ Base64编码解码 DLL

    总结一下,"C++ Base64编码解码 DLL"提供了在C++环境中进行Base64编码和解码的工具,主要包含三个文件:Base64.dll(实现函数的动态库),Base64.h(函数声明的头文件),Base64.lib(链接库文件)。开发者可以通过...

    c++实现base64算法加密解密

    c++实现base64算法加密解密,不需要修改,直接运行即可

    c++图片与base64互转

    在本案例中,我们关注的是如何在C++环境下使用OpenCV库进行图片与Base64字符串之间的相互转换。OpenCV是一个强大的计算机视觉库,除了图像处理功能外,它也可以用来读取和写入图像文件。 首先,我们需要理解Base64...

    base64编码和解码c++代码

    以下将详细讨论Base64编码的原理、C++实现Base64编码和解码的步骤,以及如何从live555源码中移植和修改代码。 Base64编码原理: 1. 将每3个字节(24位)分为4个6位组。 2. 每个6位组转换为一个0-63的数字,然后用...

    C++base64编码源代码+2小时教学视频百度云下载地址.

    根据提供的百度云链接,你可以获取到C++Base64编码的源代码及2小时的教学视频。这些资源将帮助你更好地理解Base64编码的概念,并学会如何在C++中实现这一编码方式。建议按照以下步骤使用这些资源: 1. **观看教学...

    Base64.rar_BASE64 解码_base64 c++_base64编码_c++ base64

    base64编码解码,vc6,主要用了base64编码解码的类

    Base64编码解码工具

    C++中的Base64编码解码工具是开发者在处理这类问题时的重要辅助,本文将深入探讨Base64编码的原理及其在C++中的实现。 首先,Base64编码的基本原理是将每3个字节(24位)的数据分为4组,每组6位,然后将这6位二进制...

    c/c++Base64编码

    在C/C++中实现Base64编码解码,可以自定义一个映射表,包含64个Base64字符,并编写相应的编码和解码函数。例如,`b64_samp`这个文件可能是示例代码,包含了如何用C/C++实现Base64编码解码的代码片段。通常,这样的...

    Windows平台c++工程base64与二进制文件相互转化

    在前人的基础上增加了json解析封装得到base64或反转成文件。包括案例,源代码。 调用简单,不错的学习案例。 std::unique_ptr*&gt;p(new const char*(readfile64("{\"filename\":\"D:\\\\job\\\\greatwall\\\\test\\\\1...

    base64 加解码 base64转hex Base64转图片 图片转Base64工具,比网上其它的方便好用,支持大于1M内容

    Base64是一种在互联网上广泛使用的编码方式,它将任意二进制数据转换为可打印的ASCII字符,以便在网络传输中不受限制。这种编码方法基于一个64字符的字母数字表,包括大小写字母、数字以及"+"和"/",末尾可能带有...

Global site tag (gtag.js) - Google Analytics