• java Base64算法


    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例题】3.1 7、11、13的倍数
    【Java例题】2.7找零钱
    【Java例题】2.6 三角形的面积
    【Java例题】2.5 温度转换
    【Java例题】2.4求函数
    【Java例题】2.2 分数类
    【Java例题】2.3 计算银行存款本息
    博客园里面关于abpZero的好的教程
    IOC学习1
    1.开始第一个MVC项目
  • 原文地址:https://www.cnblogs.com/ghostwolf1/p/14036613.html
Copyright © 2020-2023  润新知