`
seara
  • 浏览: 624416 次
  • 性别: 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编码解码原理及实现

    Base64编码解码原理及实现,作者黄锦威,如有版权侵犯,将立即撤销。

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

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

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

    NULL 博文链接:https://chhj-292.iteye.com/blog/379700

    BASE64编码和解码的JAVA实现

    BASE64编码和解码的JAVA实现。 太简单了。直接调用API实现的。 反正不要分,你们看着下吧。

    JavaScript实现Base64编码转换

    简介 Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64,所以每6个...当然,你也可以将图片、文本和音视频转换成二进制序列,再然后转换为Base64编码。我们这里讨论的是如何将二进制转换

    Base64实现原理,Base64文件加密

    BASE64位编码,主要介绍BASE64编码和解码的过程,包括了对字节、字符串、不同编码格式、文件的编码和解码

    Base64编码实例详解

    关于Base64加密算法的3个详细例子,用于博文《Base64编码原理解析与Java实现》

    base64:js实现base64编码解码

    base64编码原理: base64可编码范围(ASCII字符范围内\u0000-\u00ff),所以每个字符必须8位,以3个字符为一组,转换为6bit的字节(3*8=4*6=24). 在每个6bit字节的高位添加0组成8bit的字节,然后将每8bit字节转换为10进制...

    Base64编码解码c语言实现

    Base64编码解码原理介绍及c代码实现

    C#程序对UTF8,BASE64编码的工作原理程序化实现

    现今网络应用已经很普及,而对网络方面的编程少不了要用到不同的编码,本程序只是简单的对UTF8及BASE64编码进行简单的剖析,仅供学习参考,若您有更优化的处理办法希望能共同研究一下。程序是用C#编写。我曾用过其它...

    Base64编码解码原理及C#编程实例

    主要介绍了Base64编码解码原理及C#编程实例,本文讲解了Base64编码由来、Base64编码原理、C#编程实现,需要的朋友可以参考下

    Base64加密算法C语言代码实现

    Base64编码的核心原理是将二进制数据进行分组,每24Bit(3字节)为一个大组,再把一个大组的数据分成4个6Bit的小分组。由于6Bit数据只能表示64个不同的字符(2^6=64),所以这也是Base64的名字由来。

    Java之Base64编解码.pptx.pptx

    Java Base64编码原理 Java Base64编码是一种用64个字符表示任意二进制数据的方法,通过将3个字节的数据转换为4个Base64字符,实现数据的压缩和传输。 Java Base64解码过程 Java Base64解码是将Base64编码后的字符串...

    base64一种简单实用变异编码的思路和实现

    base64编码是将原来24位扩展成32位,得到0-64之间的索引值,按特定码表重新编码后来实现。所有长度会增加1/3。优点:编码解码简单,速度快,体积小。缺点:不安全。优点就不说了,说一说为什么会不安全。不安全体现在两个...

    关于base64编码的原理及实现方法分享

    我们的图片大部分都是可以转换成base64编码的data:image。 这个在将canvas保存为img的时候尤其有用

    易语言-base64一种简单实用变异编码的思路和实现

    base64编码是将原来24位扩展成32位,得到0-64之间的索引值,按特定码表重新编码后来实现 所有长度会增加1/3 优点:编码解码简单,速度快,体积小 缺点:不安全 优点就不说了,说一说为什么会不安全 不安全体现在两个方面 1 ...

    C/C++ base91算法实现

    base91是base家族中的编码一员,本程序提供使用c++编写实现base91的编码和解码的源码,源码里面包含base91的原理和部分注释 本程序仅供base91的学习,如有问题请留言

    Base64、Base58原理及GO实现其加密解密

    Base64 1.Base64就是一种基于64个可打印的字符来表示二进制数据的方法 Base64使用了26个字母、26个大写字母、10个数字以及两个符号(+、/),用语在电子邮件这样的基于文本...3.Go实现Base64加密解密 package main impo

    base64一种简单实用变异编码的思路和实现-易语言

    base64编码是将原来24位扩展成32位,得到0-64之间的索引值,按特定码表重新编码后来实现 所有长度会增加1/3 大概原理如下图: ========== 优点:编码解码简单,速度快,体积小 缺点:不安全 优点就不说了,说一说为什么会不...

    Delphi 实例程序

    简单编码工具,base64编码规范及相关实现原理; Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符...

Global site tag (gtag.js) - Google Analytics