`
orange5458
  • 浏览: 347502 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

base64 编码原理

    博客分类:
阅读更多

 

    Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式。
具体转化形式间下图:
字符串“张3”
11010101 11000101 00110011

00110101 00011100 00010100 00110011
表1

可以这么考虑:把8位的字节连成一串110101011100010100110011
然后每次顺序选6个出来之后再把这6二进制数前面再添加两个0,就成了一个新的字节。之后再选出6个来,再添加0,依此类推,直到24个二进制数全部被选完。
让我们来看看实际结果:

字符串“张3”
11010101 HEX:D5 11000101 HEX:C5 00110011 HEX:33

00110101 00011100 00010100 00110011
字符’5’ 字符’^\’ 字符’^T’ 字符’3’
十进制53 十进制34 十进制20 十进制51
表2

这样“张3 ”这个字符串就被Base64表示为”5^\^T3”了么?。错!
Base64编码方式并不是单纯利用转化完的内容进行编码。像’^\’字符是控制字符,并不能通过计算机显示出来,在某些场合就不能使用了。Base64有其自身的编码表:

Table 1: The Base64 Alphabet
Value Encoding Value Encoding Value Encoding Value Encoding
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 (pad) =
14 O 31 f 48 w
15 P 32 g 49 x
16 Q 33 h 50 y
表3

这也是Base64名称的由来,而Base64编码的结果不是根据算法把编码变为高两位是0而低6为代表数据,而是变为了上表的形式,如”A”就有7位,而”a”就只有6位。表中,编码的编号对应的是得出的新字节的十进制值。因此,从表2可以得到对应的Base64编码:

字符串“张3”
11010101 HEX:D5 11000101 HEX:C5 00110011 HEX:33

00110101 00011100 00010100 00110011
字符’5’ 字符’^\’ 字符’^T’ 字符’3’
十进制53 十进制34 十进制20 十进制51
字符’1’ 字符’i’ 字符’U’ 字符’z’
表4

这样,字符串“张3”经过编码后就成了字符串“1iUz”了。
Base64将3个字节转变为4个字节,因此,编码后的代码量(以字节为单位,下同)约比编码前的代码量多了1/3。之所以说是“约”,是因为如果代码量正好是3的整数倍,那么自然是多了1/3。但如果不是呢?
细心的人可能已经注意到了,在The Base64 Alphabet中的最后一个有一个(pad) =字符。这个字符的目的就是用来处理这个问题的。
当代码量不是3的整数倍时,代码量/3的余数自然就是2或者1。转换的时候,结果不够6位的用0来补上相应的位置,之后再在6位的前面补两个0。转换完空出的结果就用就用“=”来补位。譬如结果若最后余下的为2个字节的“张”:

字符串“张”
11010101 HEX:D5 11000101 HEX:C5

00110101 00011100 00010100
十进制53 十进制34 十进制20 pad
字符’1’ 字符’i’ 字符’U’ 字符’=’
表6

这样,最后的2个字节被整理成了“1iU=”。
同理,若原代码只剩下一个字节,那么将会添加两个“=”。只有这两种情况,所以,Base64的编码最多会在编码结尾有两个“=”

分享到:
评论

相关推荐

    Base64编码原理及base64函数

    BASE64编码是一种常用的将二进制数据转换为可打印字符的编码。讲解了编码原理以及base64函数

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

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

    Base64编码实例详解

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

    Base64编码解码原理及实现

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

    Java之Base64编解码.pptx.pptx

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

    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语言实现(带注释说明原理) 其中包括:base64编码接口和base64解码接口

    JavaScript实现Base64编码转换

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

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

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

    Base64实现原理,Base64文件加密

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

    UUE & Base64编码解码原理

    UUE(UUENCODE ) & Base64编码解码原理源代码。可自定义编码表(纯字符串),修改编码表即可在UUE和Base64编码解码之间切换,已优化解决不支持中文的BUG。 纯字符串方式,不考虑定长折行和加行首字符及文件头尾定义...

    BASE64编码和解码的JAVA实现

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

    UUENCODE_Base64编码解码原理源码 VB6

    UUE(UUENCODE ) & Base64编码解码原理源代码。可自定义编码表(纯字符串),修改编码表即可在UUE和Base64编码解码之间切换,已优化解决不支持中文的BUG。 纯字符串方式,不考虑定长折行和加行首字符及文件头尾定义...

    Base64编码介绍

    Base64 编码详细介绍,包裹原理,编码规则。

    node.js学习之base64编码解码

    一. Base64编码由来 为什么会有Base64编码呢?因为有些网络传送渠道并不支持所有的字节,例如传统的邮件只支持可见字符的传送,像ASCII码的... Base64编码原理 看一下Base64的索引表,字符选用了”A-Z、a-z、0-9、+、

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

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

    bbase64编码转换原理.doc

    base64base64base64base64base64base64base64base64

    python base64编码解码详细笔记

    python中base64编码解码模块的使用笔记, 超级详细. 语法规划, 应用举例. 原理说明.

    Base64编码解码c语言实现

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

Global site tag (gtag.js) - Google Analytics