jssj

1. 说明

Base64加密方式:比较简单,加密快,对普通大众可以起到加密的作用。在程序员眼中和透明一样。

Base64应用场景:图片转码(应用于邮件,img标签,http加密)

2. 案例

import java.util.Base64;

/**
 * Java 8的java.util套件中,新增了Base64的类别,可以用来处理Base64的编码与解码
 * 跟操作系统无关,因为我是64位系统。其实你打印的是 int 类型的, 1个int 4个字节 所以32位。
 * GBK采用双字节8位表示,总体编码范围为 8140 -- FEFE,首字节在 81 -- FE 之间,尾字节在 40 -- FE 之间。
 * ASCII是7位编码,只使用前7位,第8位补0,所以转换成整数始终为正数,而GBK是8位编码,也就是说一个字节中的第8位可以为1,如1010 1101,而将其转换成byte类型时,byte值为10101101,以补码存储,第8位被当成符号位,当然是负数了,值为:-83。
 * “何”字的GBK编码是:BA CE(1011 1010 1100 1110),两个字节第8位都为1,对byte类型来说,都被理解为最高位符号位。这样值就变成-70和-50了。
 */
public class MyBase64 {
    public static void main(String[] args) {
        try {
            Base64.Decoder decoder = Base64.getDecoder();
            Base64.Encoder encoder = Base64.getEncoder();
            String text = "通";
            byte[] textByte = text.getBytes("GBK");
            //编码
            String encodedText = encoder.encodeToString(textByte);
            System.out.println(encodedText);
            //解码
            System.out.println(new String(decoder.decode(encodedText), "GBK"));

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行结果:

3. 分析原理

码表:Java中的源码(外加一个“=” 组成)。

/**
 * This array is a lookup table that translates 6-bit positive integer
 * index values into their "Base64 Alphabet" equivalents as specified
 * in "Table 1: The Base64 Alphabet" of RFC 2045 (and RFC 4648).
 */
private static final char[] toBase64 = {
    \'A\', \'B\', \'C\', \'D\', \'E\', \'F\', \'G\', \'H\', \'I\', \'J\', \'K\', \'L\', \'M\',
    \'N\', \'O\', \'P\', \'Q\', \'R\', \'S\', \'T\', \'U\', \'V\', \'W\', \'X\', \'Y\', \'Z\',
    \'a\', \'b\', \'c\', \'d\', \'e\', \'f\', \'g\', \'h\', \'i\', \'j\', \'k\', \'l\', \'m\',
    \'n\', \'o\', \'p\', \'q\', \'r\', \'s\', \'t\', \'u\', \'v\', \'w\', \'x\', \'y\', \'z\',
    \'0\', \'1\', \'2\', \'3\', \'4\', \'5\', \'6\', \'7\', \'8\', \'9\', \'+\', \'/\'
};

以“通”字为例:

通在GBK编码下的字节码为:1100110110101000。按照每六位重新划分,然后根据6位二进制转换成10进制。最后去码表找对应的值即可。特别说明:Base64,一定是4*n位,

不够的使用“=”代替。 如下表格。

根据上图可以很清楚的看懂过程。

查看源码也可以比较简单的看懂加密和解密的过程。

 

参考:https://blog.csdn.net/u013068377/article/details/78921720

分类:

技术点:

相关文章: