Base64编码,是我们程序开发中经常使用到的编码方法。它是一种基于用64个可打印字符来表示二进制数据的表示方法。它通常用作存储、传输一些二进制数据编码方法!也是MIME(多用途互联网邮件扩展,主要用作电子邮件标准)中一种可打印字符表示二进制数据的常见编码方法!它其实只是定义用可打印字符传输内容一种方法,并不会产生新的字符集!有时候,我们学习转换的思路后,我们其实也可以结合自己的实际需要,构造一些自己接口定义编码方式。好了,我们一起看看,它的转换思路吧!

Base64实现转换原理

它是用64个可打印字符表示二进制所有数据方法。由于2的6次方等于64,所以可以用每6个位元为一个单元,对应某个可打印字符。我们知道三个字节有24个位元,就可以刚好对应于4个Base64单元,即3个字节需要用4个Base64的可打印字符来表示。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9 ,这样共有62个字符,此外两个可打印符号在不同的系统中一般有所不同。但是,我们经常所说的Base64另外2个字符是:“+/”。

这64个字符,所对应表如下。

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

  转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。数据不足3byte的话,于缓冲区中剩下的bit用0补足。然后,每次取出6个bit,按照其值选择ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/中的字符作为编码后的输出。不断进行,直到全部输入数据转换完成。

如果最后剩下两个输入数据,在编码结果后加1个“=”;如果最后剩下一个输入数据,编码结果后加2个“=”;如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性。编码后的数据比原始数据略长,为原来的4/3。无论什么样的字符都会全部被编码,因此不像Quoted-printable 编码,还保留部分可打印字符。所以,它的可读性不如Quoted-printable编码!

文本 M a n
ASCII编码 77 97 110
二进制位 0 1 0 0 1 1 0 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 1 0
索引 19 22 5 46
Base64编码 T W F u

M的Ascii码是77,前六位对应值为19,对应base64字符是T,如此类推。其它字符编码就可以自动转换得到!我们看看另外不是刚好是3个字节的情况!

文本(1 Byte) A    
二进制位 0 1 0 0 0 0 0 1                                
二进制位(补0) 0 1 0 0 0 0 0 1 0 0 0 0                        
Base64编码 Q Q = =
文本(2 Byte) B C  
二进制位 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1     x x x x x x
二进制位(补0) 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 0 x x x x x x
Base64编码 Q k M  =

下面是js代码实现base64的转换

  1. /* utf.js - UTF-8 <=> UTF-16 convertion
  2. *
  3. * Copyright (C) 1999 Masanao Izumo <iz@onicos.co.jp>
  4. * Version: 1.0
  5. * LastModified: Dec 25 1999
  6. * This library is free. You can redistribute it and/or modify it.
  7. */
  8.  
  9. /*
  10. * Interfaces:
  11. * utf8 = utf16to8(utf16);
  12. * utf16 = utf8to16(utf8);
  13. */
  14.  
  15. function utf16to8(str) {
  16. var out, i, len, c;
  17.  
  18. out = "";
  19. len = str.length;
  20. for(i = 0; i < len; i++) {
  21. c = str.charCodeAt(i);
  22. if((c >= 0x0001) && (c <= 0x007F)) {
  23. out += str.charAt(i);
  24. } else if(c > 0x07FF) {
  25. out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
  26. out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F));
  27. out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
  28. } else {
  29. out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F));
  30. out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
  31. }
  32. }
  33. return out;
  34. }
  35.  
  36. function utf8to16(str) {
  37. var out, i, len, c;
  38. var char2, char3;
  39.  
  40. out = "";
  41. len = str.length;
  42. i = 0;
  43. while(i < len) {
  44. c = str.charCodeAt(i++);
  45. switch(c >> 4) {
  46. case 0:
  47. case 1:
  48. case 2:
  49. case 3:
  50. case 4:
  51. case 5:
  52. case 6:
  53. case 7:
  54. // 0xxxxxxx
  55. out += str.charAt(i - 1);
  56. break;
  57. case 12:
  58. case 13:
  59. // 110x xxxx 10xx xxxx
  60. char2 = str.charCodeAt(i++);
  61. out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
  62. break;
  63. case 14:
  64. // 1110 xxxx 10xx xxxx 10xx xxxx
  65. char2 = str.charCodeAt(i++);
  66. char3 = str.charCodeAt(i++);
  67. out += String.fromCharCode(((c & 0x0F) << 12) |
  68. ((char2 & 0x3F) << 6) |
  69. ((char3 & 0x3F) << 0));
  70. break;
  71. }
  72. }
  73.  
  74. return out;
  75. }
  76.  
  77. //上面的这段代码中定义了两个函数,utf16to8()用于将utf-16转成utf-8,utf8to16用于将utf-8转成utf-16。
  78. //
  79. //下面才是真正用于base64编码的函数。
  80.  
  81. /* Copyright (C) 1999 Masanao Izumo <iz@onicos.co.jp>
  82. * Version: 1.0
  83. * LastModified: Dec 25 1999
  84. * This library is free. You can redistribute it and/or modify it.
  85. */
  86.  
  87. /*
  88. * Interfaces:
  89. * b64 = base64encode(data);
  90. * data = base64decode(b64);
  91. */
  92.  
  93. var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  94. var base64DecodeChars = new Array(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
  95. 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
  96. 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
  97. 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);
  98.  
  99. function base64encode(str) {
  100. var out, i, len;
  101. var c1, c2, c3;
  102.  
  103. len = str.length;
  104. i = 0;
  105. out = "";
  106. while(i < len) {
  107. c1 = str.charCodeAt(i++) & 0xff;
  108. if(i == len) {
  109. out += base64EncodeChars.charAt(c1 >> 2);
  110. out += base64EncodeChars.charAt((c1 & 0x3) << 4);
  111. out += "==";
  112. break;
  113. }
  114. c2 = str.charCodeAt(i++);
  115. if(i == len) {
  116. out += base64EncodeChars.charAt(c1 >> 2);
  117. out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
  118. out += base64EncodeChars.charAt((c2 & 0xF) << 2);
  119. out += "=";
  120. break;
  121. }
  122. c3 = str.charCodeAt(i++);
  123. out += base64EncodeChars.charAt(c1 >> 2);
  124. out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
  125. out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));
  126. out += base64EncodeChars.charAt(c3 & 0x3F);
  127. }
  128. return out;
  129. }
  130.  
  131. function base64decode(str) {
  132. var c1, c2, c3, c4;
  133. var i, len, out;
  134.  
  135. len = str.length;
  136. i = 0;
  137. out = "";
  138. while(i < len) {
  139. /* c1 */
  140. do {
  141. c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
  142. } while (i < len && c1 == -1);
  143. if(c1 == -1)
  144. break;
  145.  
  146. /* c2 */
  147. do {
  148. c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
  149. } while (i < len && c2 == -1);
  150. if(c2 == -1)
  151. break;
  152.  
  153. out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));
  154.  
  155. /* c3 */
  156. do {
  157. c3 = str.charCodeAt(i++) & 0xff;
  158. if(c3 == 61)
  159. return out;
  160. c3 = base64DecodeChars[c3];
  161. } while (i < len && c3 == -1);
  162. if(c3 == -1)
  163. break;
  164.  
  165. out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2));
  166.  
  167. /* c4 */
  168. do {
  169. c4 = str.charCodeAt(i++) & 0xff;
  170. if(c4 == 61)
  171. return out;
  172. c4 = base64DecodeChars[c4];
  173. } while (i < len && c4 == -1);
  174. if(c4 == -1)
  175. break;
  176. out += String.fromCharCode(((c3 & 0x03) << 6) | c4);
  177. }
  178. return out;
  179. }
  180.  
  181. //上面代码中的base64encode()用于编码,base64decode()用于解码。
  182.  
  183. //因此,对utf-8字符进行编码要这样写:
  184. var str = "hello world"
  185. sEncoded = base64encode(utf16to8(str));
  186. console.log(sEncoded);//aGVsbG8gd29ybGQ=
  187. //然后,解码要这样写:
  188.  
  189. sDecoded = utf8to16(base64decode(sEncoded));
  190. console.log(sDecoded);//hello world

base64加密和解码原理和代码的更多相关文章

  1. Java Base64加密、解密原理Java代码

    Java Base64加密.解密原理Java代码 转自:http://blog.csdn.net/songylwq/article/details/7578905 Base64是什么: Base64是 ...

  2. Java Base64加密、解密原理Java代码(转载)

    博客来源:http://blog.csdn.net/songylwq/article/details/7578905 Base64是什么: Base64是网络上最常见的用于传输8Bit字节代码的编码方 ...

  3. Base64编码与解码原理

    Base64编码是使用64个可打印ASCII字符(A-Z.a-z.0-9.+./)将任意字节序列数据编码成ASCII字符串,另有“=”符号用作后缀用途. base64索引表 base64编码与解码的基 ...

  4. php使用base64加密解密图片

    php使用base64加密解密图片的实例代码. 例子: <?php //文件名:base64.php $data="/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAB ...

  5. Javascript base64加密 解密

    var base64encodechars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" ...

  6. Base64加密解密原理以及代码实现(VC++)

    Base64加密解密原理以及代码实现 转自:http://blog.csdn.net/jacky_dai/article/details/4698461 1. Base64使用A--Z,a--z,0- ...

  7. Base64加密解密原理以及代码实现

    1. Base64使用A--Z,a--z,0--9,+,/ 这64个字符.    2. 编码原理:将3个字节转换成4个字节( (3 X 8) = 24 = (4 X 6) )先读入3个字节,每读一个字 ...

  8. Java的Base64加密原理

    出自:   http://www.cnblogs.com/winner-0715/p/5920269.html http://www.cnblogs.com/koliop090/p/5203553.h ...

  9. 【代码笔记】iOS-3DES+Base64加密解密

    一,工程目录. 二,代码. RootViewController.m #import "RootViewController.h" #import "NSString+T ...

随机推荐

  1. 关于Linux MongoDB的安装

    前一篇博文讲解了如何安装与配置MongoDB的windows版,本篇博文接着上一篇讲解如何在Linux系统中安装与配置MongoDB,为了演示,我问同事要了它的云服务器用于演示,当然我自己也有,但是已 ...

  2. Java学习笔记33(集合框架七:Collections工具类)

    数组有工具类,方面操作数组 集合也有工具类:Collections 常用方法示例: package demo; import java.util.ArrayList; import java.util ...

  3. php开发中应该注意的错误开关与常见处理[开发篇]

    我们可能一开始就接触一个项目的开发,刚开始时都是信心满满,一定把这个项目做得非常完美,但是时间那么少,任务那么多,我们就只有将就了. 首先,一般情况下,我们会加一个调试标志,define('APP_D ...

  4. JAVA基础语法——标识符、修饰符、关键字(个人整理总结)

    JAVA基础语法——标识符.修饰符.关键字 一 . 标识符 1.1    什么是标识符 就是程序员在定义java程序时,自定义的一些名字,例如helloworld 程序里关键字class 后跟的Dem ...

  5. mybatis 详解(一)

    http://www.cnblogs.com/ysocean/p/7271600.html 1.什么是MyBatis? MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目 ...

  6. LeetCode:149_Max Points on a line | 寻找一条直线上最多点的数量 | Hard

    题目:Max Points on a line Given n points on a 2D plane, find the maximum number of points that lie on ...

  7. 【xsy1300】 原题的旅行 最短路+倍增

    题目大意:有一个$n$个点,$m$条边的无向图,玩家走过第$i$条边,血槽中的血会下降$v_i$点,如果不足$v_i$点,这人会当场去世. 这$n$个点中,有若干个是关键点,在这些关键点可以将血槽补满 ...

  8. PHP-----浅谈垃圾回收机制

    前言 大多数编程语言都会有自身的垃圾回收机制,php也不例外.经常听很多人说gc,也就是垃圾回收器,全程为Garbage Collection. 在php5.3之前,是不包括垃圾回收机制的,也没有专门 ...

  9. Django --需求文件requirements.txt

    在虚拟环境中使用pip生成: (venv) $ pip freeze >requirements.txt 当需要创建这个虚拟环境的完全副本,可以创建一个新的虚拟环境,并在其上运行以下命令: (v ...

  10. IE不支持 Promise 解决办法

    引入 <script src = "https://cdn.polyfill.io/v2/polyfill.min.js"></script> 或 < ...