Base64算法并不是加密算法,他的出现是为了解决ASCII码在传输过程中可能出现乱码的问题。Base64是网络上最常见的用于传输8bit字节码的可读性编码算法之一。可读性编码算法不是为了保护数据的安全性,而是为了可读性。可读性编码不改变信息内容,只改变信息内容的表现形式。

Base64使用了64中字符:大写A到Z、小写a到z、数字0到9、“+“和”/"

Byte和bit

Byte:字节,数据存储的基本单位

bit:比特(位),一个位只能存储0或1

1Byte = 8bit

一个英文字符占1个字节,8位

	@Test
public void test1() {
String a = "a";
byte[] bytes = a.getBytes();
for (byte b : bytes) {
System.out.println(b);
System.out.println(Integer.toBinaryString(b));
}
}

结果:

97
1100001

一个中文字符在不同编码下所占的字节数不同:

	@Test
public void test2() {
String a = "黄";
byte[] utf8Bytes = new byte[0];
try {
utf8Bytes = a.getBytes("utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
for (byte b : utf8Bytes) {
System.out.print(b);
System.out.print(" ");
System.out.println(Integer.toBinaryString(b));
}
System.out.println();
byte[] gbkBytes = new byte[0];
try {
gbkBytes = a.getBytes("gbk");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
for (byte b : gbkBytes) {
System.out.print(b);
System.out.print(" ");
System.out.println(Integer.toBinaryString(b));
}
}

结果:

-23    11111111111111111111111111101001
-69 11111111111111111111111110111011
-124 11111111111111111111111110000100 -69 11111111111111111111111110111011
-58 11111111111111111111111111000110

所以在UTF-8编码下,一个中文占3个字节;在GBK编码下,一个中文占2个字节。

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

Base64的编码过程:

​ 1.将字符串转为字符串数组;

​ 2.将每个字符转为ASCII码;

​ 3.将ASCII码转为8bit二进制码;

​ 4.然后每3个字节为一组(一个字节为8个bit,所以每组24个bit);

​ 5.将每组的24个bit分为4份,每份6个bit;

​ 6.在每6个bit前补0,补齐8bit(前面补0不影响数值大小);

​ 7.然后将每8bit转为10进制数,根据上面的编码表进行转换。

URL Base64算法

Base64编码值通过URL传输会出现问题,因为Base64编码中的“+”和“/”符号是不允许出现在URL中的。符号“=”用做参数分隔符,也不允许出现在URL中,根据RFC4648中的建议,“”和“.”符号都有可能代替“=”符号。但“”符号与文件系统冲突,不能使用。如果使用“.”符号,某些文件系统认为该符号连续出现两次则为错误。

所以common codec包下的URL Base64算法舍弃了填充符,使用了不定长URL Base64编码。

<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.14</version>
</dependency>

java Base64算法的更多相关文章

  1. java Base64算法的使用

    Base64是常见的网络加密算法,Base64编码可用于在HTTP环境下传递较长的标识信息.详见 Base64介绍 1 自定义的base64算法 Base64Encrypt.java public c ...

  2. java base64加解密

    接上篇java Base64算法. 根据之前过程使用base64加解密,所以写成了工具类. 代码示例; public class Base64Util { private static Logger ...

  3. java基础---->Base64算法的使用

    Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,可用于在HTTP环境下传递较长的标识信息.详细的Base64信息,可以参见维基百科:https://en.wikipedia.org ...

  4. Base64算法

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/SJQ. http://www.cnblogs.com/shijiaqi1066/p/4288372.html ...

  5. MD5加密算法(信息摘要算法)、Base64算法

    1 什么是MD5 信息摘要算法,可以将字符进行加密,每个加密对象在进行加密后都是等长的 应用场景:将用户密码经过MD5加密后再存储到数据库中,这样即使是超级管理员也没有能力知道用户的具体密码是多少:因 ...

  6. Java Base64、HMAC、SHA1、MD5、AES DES 3DES加密算法

    ●  BASE64 严格地说,属于编码格式,而非加密算法    ●  MD5(Message Digest algorithm 5,信息摘要算法)    ●  SHA(Secure Hash Algo ...

  7. 史上最全的java随机数生成算法分享(转)

    这篇文章主要介绍了史上最全的java随机数生成算法,我分享一个最全的随机数的生成算法,最代码的找回密码的随机数就是用的这个方法 String password = RandomUtil.generat ...

  8. MD5加密、时间戳转换、base64算法加密、解密

    #region MD5加密 /// <summary> /// MD5加密 /// </summary> /// <param name="str"& ...

  9. 常用Java排序算法

    常用Java排序算法 冒泡排序 .选择排序.快速排序 package com.javaee.corejava; public class DataSort { public DataSort() { ...

随机推荐

  1. BAT大佬推荐使用的HTML5的十个功能

    HTML5不是新事物.自从最初发布(2008年1月)以来,我们一直在使用它的一些功能.后来,我再次仔细查看了HTML5功能列表.看到我发现了什么?到目前为止,我还没有真正使用过它! 在本文中,我列出了 ...

  2. python打印水仙花数的个人总结

    面试过程中,提到python,面试最多的就是让你现场写代码实现水仙花.冒泡.九九乘法表,这些面试方法旨在校验面试者的python基础和思维逻辑. 先从水仙花说起,水仙花是指一个n位正整数(n>= ...

  3. 4G DTU是什么 可以应用于哪些行业?

    4G是什么? 4G是移动电话网络通过蜂窝塔传输的信号的名称,蜂窝塔连接到更宽的互联网.这些是当今智能手机使用的信号,当您外出时,可以通过手机上网,因此他们不依赖电缆或光纤,也就是说无线网. 使用合适的 ...

  4. 【Kata Daily 190904】Calculating with Functions(函数计算)

    原题: This time we want to write calculations using functions and get the results. Let's have a look a ...

  5. 用Matlab对导出的数据进行可视化

    我这里是MapReduce导出的数据,MapReduce导出的数据中,Key和Value之间用制表符分隔的,可以直接作为表格型数据进行操作,复制一下导出的数据 1. 首先在Matlab工作区创建一个元 ...

  6. 【SpringBoot】08.SpringBoot整合jsp

    SpringBoot整合jsp 1.修改pom文件加入两个坐标jstl标签库和jasper <project xmlns="http://maven.apache.org/POM/4. ...

  7. NodeJs 加入Windows开机自启动服务

    首先需要到http://nssm.cc/download/?page=download 下载 nssm,下下来之后是压缩包形式的解压之后,在命令行模式下进入到nssm的目录.之后运行:nssm ins ...

  8. SWT JFace 小制作 文本阅读器

    1 package swt_jface.demo11; 2 import java.io.File; 3 import java.io.FileInputStream; 4 import java.i ...

  9. VBA_50段代码总结

    ''                                                          30个有用的VBA代码 '目录: '1--合理使用数组:'2--一次保存并关闭所 ...

  10. 经典c程序100例==61--70

    [程序61] 题目:打印出杨辉三角形(要求打印出10行如下图) 1.程序分析: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 2.程序源代码: main() ...