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

Base64编码原理与实现

阅读更多
本文为原创,如需转载,请注明作者和出处,谢谢!

Base64编码的原理是按bit将每6个bit转换成Base64编码表中的相应字符。下面是Base64的编码表:

0 A 17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 +
12 M 29 d 46 u 63 /
13 N 30 e 47 v
14 O 31 f 48 w
15 P 32 g 49 x
16 Q 33 h 50 y

在转换到最后一个字节时,可能出现如下两种情况:
1. 最后只剩下2个bit。
2. 最后只剩下4个bit。
对于这两种情况,需要在后面被0,如下面的两个字节:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> 1101100111011101

在转换上面的字节时,最后会剩下4个bit。也就是1101,这时需要在后面补0,也就是变成了110100。如果后面补一对0,转换结果后面加一个“=”,如果补两对0,加两个“=”,也就是总共的bit数除3的余数为1,则加一个“=”,余数为2,加两个“=”。上面的两个字节是16个bit,除3的余数是1,因此,需要补一个“=”,也就是将这两个字节分成如下三组:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> 110110011101110100

其中110100后面两个0是补的,因此,查找上面的base64编码表可将这两个字节转换成如下的Base64编码:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->2d0=

下面我们来实现这个算法。算法的基本原理如下:

由于每次转换都需要6个bit,而这6个bit可能都来自一个字节,也可以来自前后相临的两个字节。定义两个变量:prevByteBitCount和nextByteBitCount,这两个变量分别表述从前一个和后一个节字取得的bit数。如果prevByteBitCount为0,表示6个bit全部来自下一个字节的高6位。如果nextByteBitCount = 0,表示6个bit全部来自前一个字节的低6位。最后通过适当的移位获得所需要的6个bit,再在上面的base64编码表中查找相应的字符。算法的实现代码如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->publicstaticStringencoder(byte[]bytes)
{
StringBuilderresult
=newStringBuilder();
Stringbase64
="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
//prevByteBitCount表示从前一个字节取得的bit数,nextByteBitCount表示从后一个字节取得的bit数
intprevByteBitCount=0,nextByteBitCount=6;
//i表示当前的数组索引,n表示已经处理的位数
inti=0,n=0;
//byteCount表示总的位数
intbyteCount=8*bytes.length;
byteb=0;
while(true)
{
//处理从前后两个字节取得位数的情况
if(prevByteBitCount>0&&nextByteBitCount>0)
{
//将前一个字节的低位向左移nextByteBitCount个bit,并使下一个字节的高位(nextByteBitCount指定的位数)右移到字节的最低位,
//然后将两个位移结果进行逻辑或,也就是将从前一个字节和后一个字节取得的相应的bit合并为一个字节的低位
b=(byte)(((0xff&bytes[i])<<nextByteBitCount)|((0xff&bytes[i+1])>>(8-nextByteBitCount)));
//将逻辑或后的结果的最高两个bit置成0
b=(byte)(b&0x3f);
prevByteBitCount
=8-nextByteBitCount;
nextByteBitCount
=6-prevByteBitCount;
}
//处理从后一个字节取得高6位的情况
elseif(prevByteBitCount==0)
{
//后一个字节的高6位右移动低6位
b=(byte)((0xff&bytes[i])>>(8-nextByteBitCount));
//处理后面的位时,就是从前一个字节取2个bit,从后一个字字取4个bit
prevByteBitCount=2;
nextByteBitCount
=4;

}
//处理从前一个字节取得低6位的情况
elseif(nextByteBitCount==0)
{
//将前一个字节的最高两个bit置成0
b=(byte)(0x3f&bytes[i]);
//处理后面的位时,从后一个字节取6个bit
prevByteBitCount=0;
nextByteBitCount
=6;

}
result.append(base64.charAt(b));
n
+=6;
i
=n/8;
intremainBitCount=byteCount-n;
if(remainBitCount<6)
{
//将剩余的bit补0后,仍然需要在base64编码表中查找相应的字符,并添加到结果字符串的最后
if(remainBitCount>0)
{
b
=bytes[bytes.length-1];
b
=(byte)(0x3f&(b<<(6-remainBitCount)));
result.append(base64.charAt(b));
}
break;
}
}
//如果总bit数除3的余数为1,加一个“=”,为2,加两个“=”
n=byteCount%3;
for(i=0;i<n;i++)
result.append(
"=");

returnresult.toString();
}

最后可以使用下面的代码来验证encoder方法的正确性:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> Strings="中华人民共和国";
byte[]bytes=s.getBytes("UTF-8");
System.out.println(encoder(bytes));
//使用jdk提供的base64转换类对字节数组进行base64编码
sun.misc.BASE64Encoderbase64Encoder=newsun.misc.BASE64Encoder();
System.out.println(base64Encoder.encode(bytes));

上面的代码的执行结果如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9
5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9


国内最棒的Google Android技术社区(eoeandroid),欢迎访问!

《银河系列原创教程》发布

《Java Web开发速学宝典》出版,欢迎定购

分享到:
评论

相关推荐

    base64编码原理,实现方式,全解。

    虽然Java 8以后已经有了官方的Base64支持,但这个文件为我们提供了另一种实现方式,可以用来理解Base64编码的工作原理。通过阅读源码,我们可以深入学习位操作、数组映射和字符编码等编程技巧。 总结来说,Base64...

    labview 图片缩放 base64编码base64解码

    同时,理解Base64编码的基本原理也是必要的,这将帮助你正确地进行编码和解码操作,确保数据的完整性和一致性。 在提供的压缩包文件“图片缩放编码解码”中,很可能包含了实现这些功能的LabVIEW程序或范例。你可以...

    易语言汇编base64编码

    Base64编码的基本原理是将每3个8位字节(24位)的数据转换成4个6位的十六进制数字,每个6位对应一个字符,这些字符来自于Base64的字符集,包括大小写字母、数字以及"+"和"/",末尾不足四位的数据用"="进行填充。...

    stm32从SD卡中读取图片进行base64编码.zip

    5. Base64编码原理与实现 6. 串口通信(UART) 7. 数据分批发送和接收 这个项目可以作为一个基础的嵌入式系统开发实践,帮助开发者理解如何在微控制器上处理图像数据并进行无线传输,同时也可以作为学习嵌入式系统...

    Base64.zip_labview base64

    1. **Base64编码原理**: - Base64编码基于64个可打印的ASCII字符,包括大小写字母、数字以及"+"和"/",还有在末尾可能会出现的等于号("=")作为填充。 - 二进制数据被分为每3个字节一组,因为每个字节有8位,3个...

    base64编码与解码C语言实现(带注释说明原理)

    base64编码与解码C语言实现(带注释说明原理) 其中包括:base64编码接口和base64解码接口

    Base64编码(VC++实现)

    在VC++环境下实现Base64编码,我们需要理解其基本原理,并通过编程来完成这个过程。 Base64编码的原理是将每3个字节(24位)的数据分为4组,每组6位。由于ASCII码是7位,因此每6位会被映射到一个介于65('A')和90...

    Base64编码解码工具成品+源码

    易语言源码文件"Base64编码解码.e"包含了实现Base64编码和解码功能的算法和用户界面设计。在源码中,我们可以看到易语言如何处理Base64编码的细节,如如何将二进制数据拆分成6位块,如何查找对应的Base64字符,以及...

    java和js相互base64编码解码

    总之,Java和JavaScript中Base64编码和解码的实现原理相似,都是将二进制数据转换为可打印的ASCII字符。Java自Java 8开始内置了Base64支持,而JavaScript则依赖于`btoa()`和`atob()`函数,或者使用第三方库。在实际...

    C语言base64编码解码库

    Base64编码原理是将每3个字节(24位)的数据转换为4个6位的ASCII字符,每个6位代表16进制的0-63之间的数字。因为24位可以分成4组,每组6位,所以编码后的字符串长度通常是输入数据长度的4/3。在编码过程中,如果最后...

    易语言API实现BASE64编码

    易语言是一种基于中文编程的程序设计语言,它旨在降低编程技术门槛,让更多人能够进行软件开发。...通过这样的实践,开发者不仅可以学习到易语言的基础知识,还能深入理解数据编码原理和API调用技巧。

    .NET 中实现 Base64 编码

    首先,我们来详细了解一下Base64编码的基本原理。Base64编码是通过将每3个8位字节的数据转换为4个6位的字节,并将这4个6位字节转换为64个可能字符中的一个。因为ASCII码有64个可打印字符(不包括换行符和控制字符)...

    易语言 base64编码转图片 如何 提高转换速度.zip

    综上所述,提高易语言中Base64编码转图片的速度,需要深入了解编码原理,熟练运用编程技巧,并结合系统特性进行优化。通过以上策略的实践和调整,可以显著提升代码执行效率,满足大规模处理需求。在“90课 易语言 ...

    c++ base64 编码

    `cpp-base64-master`可能是一个开源项目,它提供了C++实现Base64编码和解码的示例。该项目可能包含了一个或多个类或函数,用于进行Base64转换。通常,这样的库会提供一个接口,如`encodeBase64(const std::string& ...

    Base64系列第四篇 C/C++中使用Base64编码解码(从chromium库中抽取)

    本篇将深入探讨如何在C/C++环境中,利用从Chromium库中提取的代码进行Base64的编码与解码。 首先,Base64编码的原理是将每3个字节(24位)的数据转换为4个6位的字符,然后将这4个6位字符对应到Base64的字符集(包括...

    Base64编码转换工具

    在标题提到的“Base64编码转换工具”中,我们主要讨论的是一个用C#语言开发的小型应用程序,该程序能够方便地实现Base64编码与普通文本之间的相互转换。 Base64编码的基本原理是将每3个字节(24位)的数据分成4组,...

    C语言实现base64编码与解码

    1. **Base64编码原理**: Base64使用64个可打印的ASCII字符(包括大小写字母、数字、加号`+`和斜线`/`)来表示任意二进制数据。每3个字节(24位)的数据被拆分为4个6位的块,每个块转换为对应的Base64字符。由于24...

    Base64编码解码c语言实现

    在C语言中实现Base64编码解码,需要理解其基本原理并编写相应的函数。 Base64编码的基本原理是将每3个字节(24位)的数据转换为4个6位的Base64字符。由于24位可以表示64的三次方种组合,因此可以完全覆盖64个字符集...

    C语言实现Base64编码与解码

    1. **Base64编码原理**: - Base64编码基于64个字符集,包括大小写字母(A-Z,a-z),数字(0-9)和两个符号(+,/)。每个6位的二进制数据块对应一个Base64字符。 - 通常,每3个8位的字节(24位)被分为4个6位的...

Global site tag (gtag.js) - Google Analytics