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处理各种编码方式的加密,解密处理功能。
总结来说,"C#图片灰度处理+base64处理"项目涵盖了图像处理和数据编码两个关键知识点,这些技能在现代Web开发和移动应用开发中扮演着重要角色。掌握这些技术可以帮助开发者更高效地处理和传输图像数据。
在这个主题中,我们将深入探讨如何实现一个Base64编码工具类以及与之相关的Java JAR文件。 首先,Base64编码的基本原理是将每3个字节(24位)的数据转化为4个6位的ASCII字符。由于24不能被6整除,所以对于不足的...
1. base64.pbl:这是一个PowerBuilder库文件,其中包含了实现Base64编码的类或其他对象。在PowerBuilder中,库(PBL)是存储对象、窗口、表单、事件处理等的地方,开发者可以将相关的代码组织在一起,方便管理和重用...
总结,这个基于Java Base64的Android加密解密工具类为Android开发者提供了一种简单且安全的方式来处理敏感数据。它利用了Java的内置加密库,结合Base64编码,实现了公钥加密和私钥解密,使得数据在传输过程中得到...
自Java 8开始,官方提供了更安全且稳定的Base64处理类`java.util.Base64`。它包含三个静态子类:`Encoder`、`Decoder`和`MimeBodyEncoder`,分别用于编码、解码和处理MIME类型的数据。 ##### 4.1 使用`java.util....
在.Net框架下,Base64编码和解码也可以通过内置的System.Convert类或者System.Text.Encoding类的静态方法来实现。例如,`Convert.FromBase64String()`用于Base64字符串到字节数组的转换,而`Convert.ToBase64String...
在早期的Java版本中,如JDK 1.4及更早版本,可以使用`sun.misc.BASE64Encoder`和`sun.misc.BASE64Decoder`类进行Base64操作,但这些类位于非公开的`sun.misc`包下,不是标准API,使用它们可能引发不兼容性问题,且不...
自Java 8开始,Java引入了`java.util.Base64`类,这是一个标准的API,提供了更安全、更稳定的方法来处理Base64编码和解码。这个新的API包括了`Encoder`和`Decoder`接口,以及它们的默认实现。开发者应该优先考虑...
这个jar包是专门为Java开发者设计的,简化了在Java应用程序中处理Base64编码的过程。 在Java开发中,Base64Utils库提供了方便的API,使得对字符串、字节数组或输入/输出流进行Base64操作变得简单。例如,你可以使用...
### ASP.NET(C#) Base64编码处理类详解 在ASP.NET框架中,尤其是在使用C#语言进行开发时,Base64编码是一个非常常见的数据处理技术。它主要用于将二进制数据转换为文本字符串,以便在传输过程中更容易处理和存储。...
"jodd-mobile-3.6.6.jar" 指的是Jodd框架的移动版本,可能针对移动设备的性能和内存限制进行了优化,提供了适合于Android或iOS等平台的Base64处理工具。 "jodd-joy-3.6.6.jar" 和 "jodd-joy-3.6.6-sources.jar" ...
在C++编程环境中,为了方便处理Base64编码和解码,通常会封装成一个专门的类。在这个场景中,"VC++ Base64类"就是这样一个工具,它提供了在Visual C++环境下对Base64进行操作的接口。 Base64编码的基本原理是将每3...
在JDK 1.6中,Sun提供了自己的Base64编码类`sun.misc.BASE64Encoder`和解码类`sun.misc.BASE64Decoder`。但这些类并不是公开的API,而是Sun内部使用的工具类。这意味着它们并不被官方文档所支持,并且可能会随着JDK...
在Excel中使用VBA(Visual Basic for Applications)解码BASE64编码的图片是一项常见的编程任务,特别是当你需要处理从网络或数据库中获取的BASE64格式的图像数据时。BASE64是一种用于将二进制数据转换为可打印ASCII...
BASE64编码和解码在Java中通过`BASE64Encoder`和`BASE64Decoder`(或`android.util.Base64`)实现,它们在数据传输和存储中起着至关重要的作用,尤其是当需要在不支持二进制数据的环境中处理二进制数据时。...
BASE64Decoder是一个Java类,属于Sun Microsystems的`sun.misc`包,用于解码使用BASE64编码的数据。BASE64是一种广泛使用的编码方法,它将任意二进制数据转换为可打印的ASCII字符,通常在电子邮件、XML文档以及网络...
在Java中,可以使用`sun.misc.BASE64Encoder`和`sun.misc.BASE64Decoder`类来进行Base64的编码和解码操作。需要注意的是,这些类自JDK 9起已被废弃,并在JDK 11中被移除。因此,在较新的Java版本中,推荐使用`java....
然而,描述中提到的是一个名为`BASE64Encoder.jar`的文件,这可能是一个早期的Java库,用于处理Base64编码和解码,可能在Java 8之前使用,因为它包含了`BASE64Encoder`和`BASE64Decoder`这两个类。 `BASE64Encoder`...
在Java中,`java.util.Base64`类提供了Base64编码和解码的功能。`Base64.Encoder`接口代表Base64编码器,而`Base64.Decoder`接口代表Base64解码器。你可以通过`Base64.getEncoder()`和`Base64.getDecoder()`获取默认...