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. GMM高斯混合模型学习笔记(EM算法求解)

    提出混合模型主要是为了能更好地近似一些较复杂的样本分布,通过不断添加component个数,能够随意地逼近不论什么连续的概率分布.所以我们觉得不论什么样本分布都能够用混合模型来建模.由于高斯函数具有一 ...

  2. Android 结合实例学会AsyncTask的使用方法

    AsyncTask运行时经过四个步骤,运行四个方法:           1.onPreExecute(),执行在UI线程,能够设置或改动UI控件,如显示一个进度条           2.doInB ...

  3. LINUX专题之操作系统字符集

    原创作品,出自 "深蓝的blog" 博客,欢迎转载.转载时请务必注明下面出处,否则追究版权法律责任. 深蓝的blog: http://blog.csdn.net/huangyanl ...

  4. SQL_由创建表引出

    ***********************************************声明*************************************************** ...

  5. 关于windows系统影子账户的问题

    在这之前,需要大家了解几个问题,一个是SID,一个是账号的F值. Windows账户的SID 在Windows系统中,系统会为每个用户账户建立一个唯一的安全标识符(Security Identifie ...

  6. Ubuntu 32下Android NDK+NEON的配置过程及简单使用举例

    1.  利用VMware在Windows7 64位下安装Ubuntu13.10 32位虚拟机: 2.  从 https://developer.android.com/tools/sdk/ndk/in ...

  7. Drools学习笔记-01-在eclipse indgo集成Drools5.5

    1.1.条件 Drools它是一个基于Java开源规则引擎.因此,使用Drools以及前需要安装在开发机器JDK周边环境,Drools5.5需要JDK版本号的1.5或者更多. 1.2.开发环境搭建 大 ...

  8. 神经网络BP算法C和python代码

    上面只显示代码. 详BP原理和神经网络的相关知识,请参阅:神经网络和反向传播算法推导 首先是前向传播的计算: 输入: 首先为正整数 n.m.p.t,分别代表特征个数.训练样本个数.隐藏层神经元个数.输 ...

  9. 从零开始学Xamarin.Forms(三) Android 制作启动画面

    原文:从零开始学Xamarin.Forms(三) Android 制作启动画面     Xamarin.Forms 在启动的时候相当慢,必须添加一个启动界面,步骤如下: 1.将启动画面的图片命名为:s ...

  10. Xamarin For Visual Studio 3.7.165 完整离线破解版

    原文 Xamarin For Visual Studio 3.7.165 完整离线破解版 Xamarin For Visual Studio就是原本的Xamarin For Android 以及 Xa ...