base 64 编解码


1. base64的编码都是按字符串长度,以每3个8bit的字符为一组,


2. 然后针对每组。首先获取每一个字符的ASCII编码。


3. 然后将ASCII编码转换成8bit的二进制,得到一组3*8=24bit的字节


4. 然后再将这24bit划分为4个6bit的字节,并在每一个6bit的字节前面都填两个高位0。得到4个8bit的字节


5. 然后将这4个8bit的字节转换成10进制。对比Base64编码表 (下表)。得到相应编码后的字符。


watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHVoZWF6eA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">


实现:

//////////////////////////////////////////////////////////////////////
//
// base64 Encoding/Decoding:
// Encoding: String2Base64: unsigned char * to base64;
// Decoding: Base642TString: base64 to unsigned char * .
//
// xuhh
// Dec 11, 2014
//
////////////////////////////////////////////////////////////////////// #if !defined(_MIME_CODING_H)
#define _MIME_CODING_H #if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000 #include <utility>
#include <string>
#include <list>
using namespace std; #if !defined(ASSERT)
#if defined(_DEBUG)
#include <assert.h>
#define ASSERT(exp) assert(exp)
#else
#define ASSERT(exp) ((void)0)
#endif
#endif #if defined(_DEBUG) && !defined(DEBUG_NEW)
#define DEBUG_NEW new
#endif // maximum length of an encoded line (RFC 2045)
#define MAX_MIME_LINE_LEN 76
#define MAX_ENCODEDWORD_LEN 75 //////////////////////////////////////////////////////////////////////
// string to base64 extern unsigned char * String2Base64(const char* str); //////////////////////////////////////////////////////////////////////
// base64 to string extern unsigned char * Base642TString(const char* str); //////////////////////////////////////////////////////////////////////
// CMimeEnvironment - global environment to manage encoding/decoding class CMimeCodeBase; #define DECLARE_MIMECODER(class_name) \
public: static CMimeCodeBase* CreateObject() { return new class_name; } //////////////////////////////////////////////////////////////////////
// CMimeCodeBase class CMimeCodeBase
{
public:
CMimeCodeBase() :
m_pbInput(NULL),
m_nInputSize(0),
m_bIsEncoding(false) {} public:
void SetInput(const char* pbInput, int nInputSize, bool bEncoding)
{
m_pbInput = (const unsigned char*) pbInput;
m_nInputSize = nInputSize;
m_bIsEncoding = bEncoding;
}
int GetOutputLength() const
{
return m_bIsEncoding ? GetEncodeLength() : GetDecodeLength();
}
int GetOutput(unsigned char* pbOutput, int nMaxSize)
{
return m_bIsEncoding ? Encode(pbOutput, nMaxSize) : Decode(pbOutput, nMaxSize);
} protected:
// overrides
virtual int GetEncodeLength() const { return m_nInputSize; }
virtual int GetDecodeLength() const { return m_nInputSize; }
virtual int Encode(unsigned char* pbOutput, int nMaxSize) const
{
int nSize = min(nMaxSize, m_nInputSize);
::memcpy(pbOutput, m_pbInput, nSize);
return nSize;
}
virtual int Decode(unsigned char* pbOutput, int nMaxSize)
{
return CMimeCodeBase::Encode(pbOutput, nMaxSize);
} protected:
const unsigned char* m_pbInput;
int m_nInputSize;
bool m_bIsEncoding;
}; //////////////////////////////////////////////////////////////////////
// CMimeCodeBase64 - for base64 encoding mechanism class CMimeCodeBase64 : public CMimeCodeBase
{
public:
CMimeCodeBase64() :
m_bAddLineBreak(true) {} public:
DECLARE_MIMECODER(CMimeCodeBase64)
void AddLineBreak(bool bAdd=true) { m_bAddLineBreak = bAdd; } protected:
virtual int GetEncodeLength() const;
virtual int GetDecodeLength() const;
virtual int Encode(unsigned char* pbOutput, int nMaxSize) const;
virtual int Decode(unsigned char* pbOutput, int nMaxSize); private:
bool m_bAddLineBreak; private:
static inline int DecodeBase64Char(unsigned int nCode)
{
if (nCode >= 'A' && nCode <= 'Z')
return nCode - 'A';
if (nCode >= 'a' && nCode <= 'z')
return nCode - 'a' + 26;
if (nCode >= '0' && nCode <= '9')
return nCode - '0' + 52;
if (nCode == '+')
return 62;
if (nCode == '/')
return 63;
return 64;
}
}; #endif // !defined(_MIME_CODING_H)


实现文件:



//////////////////////////////////////////////////////////////////////
//
// base64 Encoding/Decoding:
// Encoding: String2Base64: unsigned char * to base64;
// Decoding: Base642TString: base64 to unsigned char * .
//
// xuhh
// Dec 11, 2014
//
//////////////////////////////////////////////////////////////////////
#include "MimeCode.h" #ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif //////////////////////////////////////////////////////////////////////////
// string to base64
unsigned char* String2Base64(const char * szStr)
{
CMimeCodeBase64 base64;
base64.SetInput(szStr, strlen(szStr), true);
int nLen = base64.GetOutputLength()+1;
unsigned char* pOutput = new unsigned char[nLen];
nLen = base64.GetOutput(pOutput, nLen);
pOutput[nLen] = 0;
return pOutput;
} //////////////////////////////////////////////////////////////////////////
// base64 to string unsigned char * Base642TString(const char* str)
{
CMimeCodeBase64 base64;
base64.SetInput(str, strlen(str), false);
int len = base64.GetOutputLength()+1;
unsigned char* pOutput = new unsigned char[len];
len = base64.GetOutput(pOutput, len);
pOutput[len] = 0;
return pOutput;
} //////////////////////////////////////////////////////////////////////
// CMimeCodeBase64 int CMimeCodeBase64::GetEncodeLength() const
{
int nLength = (m_nInputSize + 2) / 3 * 4;
if (m_bAddLineBreak)
nLength += (nLength / MAX_MIME_LINE_LEN + 1) * 2;
return nLength;
} int CMimeCodeBase64::GetDecodeLength() const
{
return m_nInputSize * 3 / 4 + 2;
} int CMimeCodeBase64::Encode(unsigned char* pbOutput, int nMaxSize) const
{
static const char* s_Base64Table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; unsigned char* pbOutStart = pbOutput;
unsigned char* pbOutEnd = pbOutput + nMaxSize;
int nFrom, nLineLen = 0;
unsigned char chHigh4bits = 0; for (nFrom=0; nFrom<m_nInputSize; nFrom++)
{
if (pbOutput >= pbOutEnd)
break; unsigned char ch = m_pbInput[nFrom];
switch (nFrom % 3)
{
case 0:
*pbOutput++ = s_Base64Table[ch >> 2];
chHigh4bits = (ch << 4) & 0x30;
break; case 1:
*pbOutput++ = s_Base64Table[chHigh4bits | (ch >> 4)];
chHigh4bits = (ch << 2) & 0x3c;
break; default:
*pbOutput++ = s_Base64Table[chHigh4bits | (ch >> 6)];
if (pbOutput < pbOutEnd)
{
*pbOutput++ = s_Base64Table[ch & 0x3f];
nLineLen++;
}
} nLineLen++;
if (m_bAddLineBreak && nLineLen >= MAX_MIME_LINE_LEN && pbOutput+2 <= pbOutEnd)
{
*pbOutput++ = '\r';
*pbOutput++ = '\n';
nLineLen = 0;
}
} if (nFrom % 3 != 0 && pbOutput < pbOutEnd) // 不足三位。= 补足
{
*pbOutput++ = s_Base64Table[chHigh4bits];
int nPad = 4 - (nFrom % 3) - 1;
if (pbOutput+nPad <= pbOutEnd)
{
::memset(pbOutput, '=', nPad);
pbOutput += nPad;
}
}
if (m_bAddLineBreak && nLineLen != 0 && pbOutput+2 <= pbOutEnd)
{
*pbOutput++ = '\r';
*pbOutput++ = '\n';
}
return (int)(pbOutput - pbOutStart);
} int CMimeCodeBase64::Decode(unsigned char* pbOutput, int nMaxSize)
{
const unsigned char* pbData = m_pbInput;
const unsigned char* pbEnd = m_pbInput + m_nInputSize;
unsigned char* pbOutStart = pbOutput;
unsigned char* pbOutEnd = pbOutput + nMaxSize; int nFrom = 0;
unsigned char chHighBits = 0; while (pbData < pbEnd)
{
if (pbOutput >= pbOutEnd)
break; unsigned char ch = *pbData++;
if (ch == '\r' || ch == '\n')
continue;
ch = (unsigned char) DecodeBase64Char(ch);
if (ch >= 64) // invalid encoding, or trailing pad '='
break; switch ((nFrom++) % 4)
{
case 0:
chHighBits = ch << 2;
break; case 1:
*pbOutput++ = chHighBits | (ch >> 4);
chHighBits = ch << 4;
break; case 2:
*pbOutput++ = chHighBits | (ch >> 2);
chHighBits = ch << 6;
break; default:
*pbOutput++ = chHighBits | ch;
}
} return (int)(pbOutput - pbOutStart);
}

base 64 编解码器的更多相关文章

  1. C# base 64图片编码解码

    使用WinForm实现了图片base64编码解码的 效果图: 示例base 64编码字符串: /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKD ...

  2. Base 64 编码

    原创地址:http://www.cnblogs.com/jfzhu/p/4020097.html 转载请注明出处 (一)Encoding VS. Encryption 很多人都以为编码(Encodin ...

  3. 浅谈 Data URI 与 BASE 64 编码

    前言(废话):鼓捣 Stylish 的时候发现了这么个奇怪的代码行: Data:image/gif;BASE64,R0lGODlhEAAQAKEAAEKF9NPi/AAAAAAAACH5BAEAAAI ...

  4. Base 64 & decodeURIComponent

    Base 64 & decodeURIComponent js btoa() & atob() let obj = [{"key":"q",&q ...

  5. 关于BASE 24 ,BASE 64原理以及实现程序

    关于BASE 24 ,BASE 64原理以及实现程序 来源 https://wangye.org/blog/archives/5/ 可能很多人听说过Base64编码,很少有人听说过Base24编码,B ...

  6. Base 64 & URL & blob & FileReader & createObjectURL

    Base 64 & URL & blob & FileReader & createObjectURL /** * let blob = item.getAsFile( ...

  7. base 64 & blob & image url

    base 64 & blob & image url base 64 image & e.clipboardData.items[1] https://codepen.io/x ...

  8. 快速掌握 Base 64 | 学 Java 密码系列

    Java 密码系列 - Java 和 JS Base 64 Base 64 不属于密码技术,仅是编码方式.但由于在 Java.JavaScript.区块链等出现的频率较高,故在本系列文章中首先分享 B ...

  9. Base 64 加密、解密

    1.写一个公共类 package com.boyutec.oss.sys.utils; import java.io.UnsupportedEncodingException; import java ...

随机推荐

  1. 2013 吉林通化邀请赛 Play Game 记忆化搜索

    dp[ba][ta][bb][tb]表示a堆牌从下面拿了ba张,从上面拿了ta张.b堆牌从下面拿了bb张,从上面拿了tb张.当前玩家能得到的最大的分数. 扩展方式有4种,ba+1,ta+1,bb+1, ...

  2. hdu2389(HK算法)

    传送门:Rain on your Parade 题意:t个单位时间后开始下雨,给你N个访客的位置(一维坐标平面内)和他的移动速度,再给M个雨伞的位置,问在下雨前最多有多少人能够拿到雨伞(两个人不共用一 ...

  3. Hadoop Hive与Hbase关系 整合

    用hbase做数据库,但因为hbase没有类sql查询方式,所以操作和计算数据很不方便,于是整合hive,让hive支撑在hbase数据库层面 的 hql查询.hive也即 做数据仓库 1. 基于Ha ...

  4. 网页favicon.ico图标设置(转)

    随便打开一个网页:比如 http://www.baidu.com/ 可以看到在浏览器的标签头上面显示了一个图标,这个图标是:,也就是我们常说的favicon.ico. 由于这篇文章主要讨论favico ...

  5. Android监控程序本身被卸载方法汇总

    本文章由Jack_Jia编写,转载请注明出处.   文章链接: http://blog.csdn.net/jiazhijun/article/details/10157901 作者:Jack_Jia ...

  6. SE 2014年4月29日

    交换网络中有vlan1 到20个vlan,要求使用MSTP技术实现vlan的负载分担. SW2为实例1(vlan1-vlan10)的主根,SW3为备根 SW3为实例2(vlan11-vlan20)的主 ...

  7. SocketAsyncEventArgs使用解说

    原文:SocketAsyncEventArgs使用解说 如果在.NET下写过网络通讯的同学应该感觉不陌生了,有很多刚入门的同学很多都认为这东西可以大大提高处理效能还有就是使用上很不适应.其实使用之前最 ...

  8. c++ cin>>详解

    参考地址:http://www.cnblogs.com/A-Song/archive/2012/01/29/2331204.html 程序的输入都建有一个缓冲区,即输入缓冲区.一次输入过程是这样的,当 ...

  9. java中HashMap在多线程环境下引起CPU100%的问题解决(转)

    最近项目中出现了Tomcat占用CPU100%的情况,原以为是代码中出现死循环,后台使用jstack做了dump,发现是系统中不合理使用HashMap导致出现了死循环(注意不是死锁). 产生这个死循环 ...

  10. OpenCV 编程简单介绍(矩阵/图像/视频的基本读写操作)

    PS. 因为csdn博客文章长度有限制,本文有部分内容被截掉了.在OpenCV中文站点的wiki上有可读性更好.而且是完整的版本号,欢迎浏览. OpenCV Wiki :<OpenCV 编程简单 ...