`
greenmoon
  • 浏览: 48628 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

base64处理类

 
阅读更多

base64是日常开发中经常使用的编码方式,在.net,java甚至php中都有简单的类库或函数直接调用,唯独c++中没有可用的资源,没有办法,谁让c++灵活呢,自己动手开发一个吧。

base64的原理很简单,无须赘述,google一下,一大堆,但是好用的有算法精妙的代码着实不多,自己动脑又太费神,找个成熟的其他语言的类翻译一下吧,嗯,c#的语法与c++很相似,ok,抄袭一下。不再啰嗦,直接看代码吧。

 

头文件代码如下(base64.h):

#if !defined(AFX_BASE641_H__D58B5645_B438_43B6_8844_457ADE5F85CC__INCLUDED_)
#define AFX_BASE641_H__D58B5645_B438_43B6_8844_457ADE5F85CC__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class CBase64
{
public:
static int ToBase64String(char* & pOut,char * pIn,int nLen);
static int FromBase64String(char * & pOut,char * pIn);
CBase64();
virtual ~CBase64();
protected:
static int CalculateOutputLength(int inputLength);
static int ConvertToBase64(char* outChars, char* inData, int length);
static char char2sixbit(char c);
};

#endif // !defined(AFX_BASE641_H__D58B5645_B438_43B6_8844_457ADE5F85CC__INCLUDED_)

cpp文件代码如下:

// Base641.cpp: implementation of the CBase64 class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Base64.h"
#include <string.h>
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
static char base64Table[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
CBase64::CBase64()
{

}

CBase64::~CBase64()
{

}
int CBase64::CalculateOutputLength(int inputLength)
{
int num1 = (inputLength / 3) * 4;
num1 += ((inputLength % 3) != 0) ? 4 : 0;
if (num1 == 0)
{
return num1;
}
int num2 = num1 / 0x4c;
if ((num1 % 0x4c) == 0)
{
num2--;
}
return (num1 + (num2 * 2));
}
int CBase64::ConvertToBase64(char* outChars, char* inData, int length)
{
int num1 = length % 3;
int num2 = length - num1;
int num3 = 0;
int num4 = 0;
char* chRef1 = base64Table;

int num5 = 0;
while (num5 < num2)
{

outChars[num3] = chRef1[(inData[num5] & 0xfc) >> 2];
outChars[num3 + 1] = chRef1[((inData[num5] & 3) << 4) | ((inData[num5 + 1] & 240) >> 4)];
outChars[num3 + 2] = chRef1[((inData[num5 + 1] & 15) << 2) | ((inData[num5 + 2] & 0xc0) >> 6)];
outChars[num3 + 3] = chRef1[inData[num5 + 2] & 0x3f];
num3 += 4;
num5 += 3;
}
num5 = num2;

switch (num1)
{
case 1:
break;

case 2:
outChars[num3] = chRef1[(inData[num5] & 0xfc) >> 2];
outChars[num3 + 1] = chRef1[((inData[num5] & 3) << 4) | ((inData[num5 + 1] & 240) >> 4)];
outChars[num3 + 2] = chRef1[(inData[num5 + 1] & 15) << 2];
outChars[num3 + 3] = chRef1[0x40];
num3 += 4;
goto Label_0220;

default:
goto Label_0220;
}
outChars[num3] = chRef1[(inData[num5] & 0xfc) >> 2];
outChars[num3 + 1] = chRef1[(inData[num5] & 3) << 4];
outChars[num3 + 2] = chRef1[0x40];
outChars[num3 + 3] = chRef1[0x40];
num3 += 4;

Label_0220:;
return num3;
}

int CBase64::ToBase64String(char* & pOut, char *pIn, int nLen)
{
int nOut = CalculateOutputLength(nLen);
pOut = new char[nOut + 1];
int n = ConvertToBase64(pOut,pIn,nLen);
pOut[n] = '/0';
return n;
}
int CBase64::FromBase64String(char * & pOut,char * pIn)
{
int temp = 0;
int length2, length3;
int blockCount;
int paddingCount;
int length = strlen(pIn);

//find how many padding are there
for (int x = 0; x < 2; x++)
{
if (pIn[length - x - 1] == '=')
temp++;
}
paddingCount = temp;
blockCount = length / 4;
length2 = blockCount * 3;

char * buffer = new char[length];//first conversion result
char * buffer2 = new char[length2];//decoded array with padding
for ( x = 0; x < length; x++)
{
buffer[x] = char2sixbit(pIn[x]);
}

char b, b1, b2, b3;
char temp1, temp2, temp3, temp4;

for (x = 0; x < blockCount; x++)
{
temp1 = buffer[x * 4];
temp2 = buffer[x * 4 + 1];
temp3 = buffer[x * 4 + 2];
temp4 = buffer[x * 4 + 3];

b = (char)(temp1 << 2);
b1 = (char)((temp2 & 48) >> 4);
b1 += b;

b = (char)((temp2 & 15) << 4);
b2 = (char)((temp3 & 60) >> 2);
b2 += b;

b = (char)((temp3 & 3) << 6);
b3 = temp4;
b3 += b;

buffer2[x * 3] = b1;
buffer2[x * 3 + 1] = b2;
buffer2[x * 3 + 2] = b3;
}
//remove paddings
length3 = length2 - paddingCount;
pOut = new char[length3];

for (x = 0; x < length3; x++)
{
pOut[x] = buffer2[x];
}
delete[] buffer;
delete[] buffer2;
return length3;
}

char CBase64::char2sixbit(char c)
{

if (c == '=')
return 0;
else
{
for (int x = 0; x < 64; x++)
{
if (base64Table[x] == c)
return x;
}
//should not reach here
return 0;
}
}

怎么样?还算精炼吧。

分享到:
评论

相关推荐

    BASE64处理类

    BASE64处理各种编码方式的加密,解密处理功能。

    C#图片灰度处理+base64处理

    总结来说,"C#图片灰度处理+base64处理"项目涵盖了图像处理和数据编码两个关键知识点,这些技能在现代Web开发和移动应用开发中扮演着重要角色。掌握这些技术可以帮助开发者更高效地处理和传输图像数据。

    实现base64编码工具类及整套jar.zip_Base64.jar_base64 jar_jar base64_工具类及整套j

    在这个主题中,我们将深入探讨如何实现一个Base64编码工具类以及与之相关的Java JAR文件。 首先,Base64编码的基本原理是将每3个字节(24位)的数据转化为4个6位的ASCII字符。由于24不能被6整除,所以对于不足的...

    pb9_base64_pb调用base64.dll_PB9base64_Base64.dll_glass8y6_pbbase64

    1. base64.pbl:这是一个PowerBuilder库文件,其中包含了实现Base64编码的类或其他对象。在PowerBuilder中,库(PBL)是存储对象、窗口、表单、事件处理等的地方,开发者可以将相关的代码组织在一起,方便管理和重用...

    android工具类:基于javaBase64的加密解密工具类

    总结,这个基于Java Base64的Android加密解密工具类为Android开发者提供了一种简单且安全的方式来处理敏感数据。它利用了Java的内置加密库,结合Base64编码,实现了公钥加密和私钥解密,使得数据在传输过程中得到...

    base64加密解密

    自Java 8开始,官方提供了更安全且稳定的Base64处理类`java.util.Base64`。它包含三个静态子类:`Encoder`、`Decoder`和`MimeBodyEncoder`,分别用于编码、解码和处理MIME类型的数据。 ##### 4.1 使用`java.util....

    Base64转二进制文件,Base64 To File

    在.Net框架下,Base64编码和解码也可以通过内置的System.Convert类或者System.Text.Encoding类的静态方法来实现。例如,`Convert.FromBase64String()`用于Base64字符串到字节数组的转换,而`Convert.ToBase64String...

    Base64引入包

    在早期的Java版本中,如JDK 1.4及更早版本,可以使用`sun.misc.BASE64Encoder`和`sun.misc.BASE64Decoder`类进行Base64操作,但这些类位于非公开的`sun.misc`包下,不是标准API,使用它们可能引发不兼容性问题,且不...

    BASE64Encoder.jar

    自Java 8开始,Java引入了`java.util.Base64`类,这是一个标准的API,提供了更安全、更稳定的方法来处理Base64编码和解码。这个新的API包括了`Encoder`和`Decoder`接口,以及它们的默认实现。开发者应该优先考虑...

    base64utils jar 包下载

    这个jar包是专门为Java开发者设计的,简化了在Java应用程序中处理Base64编码的过程。 在Java开发中,Base64Utils库提供了方便的API,使得对字符串、字节数组或输入/输出流进行Base64操作变得简单。例如,你可以使用...

    asp.net(c#) base64编码处理类

    ### ASP.NET(C#) Base64编码处理类详解 在ASP.NET框架中,尤其是在使用C#语言进行开发时,Base64编码是一个非常常见的数据处理技术。它主要用于将二进制数据转换为文本字符串,以便在传输过程中更容易处理和存储。...

    Base64工具类 jar包 jodd-3.6.6

    "jodd-mobile-3.6.6.jar" 指的是Jodd框架的移动版本,可能针对移动设备的性能和内存限制进行了优化,提供了适合于Android或iOS等平台的Base64处理工具。 "jodd-joy-3.6.6.jar" 和 "jodd-joy-3.6.6-sources.jar" ...

    VC++ Base64类

    在C++编程环境中,为了方便处理Base64编码和解码,通常会封装成一个专门的类。在这个场景中,"VC++ Base64类"就是这样一个工具,它提供了在Visual C++环境下对Base64进行操作的接口。 Base64编码的基本原理是将每3...

    jdk1.6解决base64

    在JDK 1.6中,Sun提供了自己的Base64编码类`sun.misc.BASE64Encoder`和解码类`sun.misc.BASE64Decoder`。但这些类并不是公开的API,而是Sun内部使用的工具类。这意味着它们并不被官方文档所支持,并且可能会随着JDK...

    BASE64图片解码_解码_vba图片base64_base64_VBa_图片_

    在Excel中使用VBA(Visual Basic for Applications)解码BASE64编码的图片是一项常见的编程任务,特别是当你需要处理从网络或数据库中获取的BASE64格式的图像数据时。BASE64是一种用于将二进制数据转换为可打印ASCII...

    BASE64Encoder 与 BASE64Decoder 源代码

    BASE64编码和解码在Java中通过`BASE64Encoder`和`BASE64Decoder`(或`android.util.Base64`)实现,它们在数据传输和存储中起着至关重要的作用,尤其是当需要在不支持二进制数据的环境中处理二进制数据时。...

    BASE64Decoder jar包

    BASE64Decoder是一个Java类,属于Sun Microsystems的`sun.misc`包,用于解码使用BASE64编码的数据。BASE64是一种广泛使用的编码方法,它将任意二进制数据转换为可打印的ASCII字符,通常在电子邮件、XML文档以及网络...

    Base64与byte[]相互转换

    在Java中,可以使用`sun.misc.BASE64Encoder`和`sun.misc.BASE64Decoder`类来进行Base64的编码和解码操作。需要注意的是,这些类自JDK 9起已被废弃,并在JDK 11中被移除。因此,在较新的Java版本中,推荐使用`java....

    java base64源码+jar包

    然而,描述中提到的是一个名为`BASE64Encoder.jar`的文件,这可能是一个早期的Java库,用于处理Base64编码和解码,可能在Java 8之前使用,因为它包含了`BASE64Encoder`和`BASE64Decoder`这两个类。 `BASE64Encoder`...

    BASE64Encoder及BASE64Decoder的源码

    在Java中,`java.util.Base64`类提供了Base64编码和解码的功能。`Base64.Encoder`接口代表Base64编码器,而`Base64.Decoder`接口代表Base64解码器。你可以通过`Base64.getEncoder()`和`Base64.getDecoder()`获取默认...

Global site tag (gtag.js) - Google Analytics