当前位置:   article > 正文

详解Base64 【Java实现】_java base64 iv

java base64 iv

一、什么是Base64?

  “Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符表示二进制数据的方法”。

  什么是“可打印字符”呢?为什么要用它来传输8Bit字节码呢?在回答这两个问题之前我们有必要来思考一下什么情况下需要使用到Base64?Base64一般用于在HTTP协议下传输二进制数据,由于HTTP协议是文本协议,所以在HTTP协议下传输二进制数据需要将二进制数据转换为字符数据。然而直接转换是不行的。因为网络传输只能传输可打印字符。什么是可打印字符?在ASCII码中规定,0~31、127这33个字符属于控制字符, 32~126这95个字符属于可打印字符,也就是说网络传输只能传输这95个字符,不在这个范围内的字符无法传输。那么该怎么才能传输其他字符呢?其中一种方式就是使用Base64。

二、为什么要使用Base 64

  Base 64主要用途不是加密,而是把一些二进制数转成普通字符,方便在网络上传输。 由于一些二进制字符在传输协议中属于控制字符,不能直接传送,所以需要转换一下才可以。由于某些系统中只能使用ASCII字符,Base64就是用来将非ASCII字符的数据转换成ASCII字符的一种方法,Base64特别适合在http,mime协议下快速传输数据。比如网络中图片的传输。

  Base64,并非安全领域下的加密解密算法。虽然经常遇到所谓的base64的加密解密。但base64只能算是一个编码算法,对数据内容进行编码来适合传输。虽然base64编码过后原文也变成不能看到的字符格式,但是方式初级又简单。

三、实现原理

  Base64编码将一个8位子节序列拆散为6位的片段,而且这每个6位的片段都会被分配一个字符,那这个是个什么字符呢?其实它是base64字母表中的64个字符之一。而这64个字符可是有讲究的,是选择了最常用而且兼容性最好的64个字符。所以可以算出base64编码后的字符串大约比编码前大了33%,因为用8位来表示6位。

  Base64编码是基于**64个字符 ** A-Z a-z 0-9 + / ,刚好 2 的 6次方 = 64 ,因此每一个base64字符占了 6bit ,字符表如下

索引对应字符索引对应字符索引对应字符索引对应字符
0A16Q32g48w
1B17R33h49x
2C18S34i50y
3D19T35j51z
4E20U36k520
5F21V37l531
6G22W38m542
7H23X39n553
8I24Y40o564
9J25Z41p575
10K26a42q586
11L27b43r597
12M28c44s608
13N29d45t619
14O30e46u62+
15P31f47v63/

四、举例

以下图的表格为示例,我们具体分析一下整个过程。

在这里插入图片描述

  • 第一步:“M”、“a”、"n"对应的ASCII码值分别为77,97,110,对应的二进制值是01001101、01100001、01101110。如图第二三行所示,由此组成一个24位的二进制字符串。
  • 第二步:如图红色框,将24位每6位二进制位一组分成四组。
  • 第三步:在上面每一组前面补两个0,扩展成32个二进制位,此时变为四个字节:00010011、00010110、00000101、00101110。分别对应的值(Base64编码索引)为:19、22、5、46。
  • 第四步:用上面的值在Base64编码表中进行查找,分别对应:T、W、F、u。因此“Man”Base64编码之后就变为:TWFu。

位数不足情况

上面是按照三个字节来举例说明的,如果字节数不足三个,那么该如何处理?

在这里插入图片描述

  • 两个字节:两个字节共16个二进制位,依旧按照规则进行分组。此时总共16个二进制位,每6个一组,则第三组缺少2位,用0补齐,得到三个Base64编码,第四组完全没有数据则用“=”补上。因此,上图中“BC”转换之后为“QKM=”;
  • 一个字节:一个字节共8个二进制位,依旧按照规则进行分组。此时共8个二进制位,每6个一组,则第二组缺少4位,用0补齐,得到两个Base64编码,而后面两组没有对应数据,都用“=”补上。因此,上图中“A”转换之后为“QQ==”;

注意事项

  • 大多数编码都是由字符串转化成二进制的过程,而Base64的编码则是从二进制转换为字符串。与常规恰恰相反,
  • Base64编码主要用在传输、存储、表示二进制领域,不能算得上加密,只是无法直接看到明文。也可以通过打乱Base64编码来进行加密。
  • 中文有多种编码(比如:utf-8、gb2312、gbk等),不同编码对应Base64编码结果都不一样。

五、Java中实现Base64

public static void main(String[] args) throws UnsupportedEncodingException {
    // 编码  将 “你好” 转化为base64编码
    String encode = Base64.getEncoder().encodeToString("你好".getBytes("UTF-8"));
    System.out.println(encode);
    // 解码
    byte[] decode = Base64.getDecoder().decode(encode);
    System.out.println(new String(decode, "UTF-8"));
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

输出 :

5L2g5aW9
你好
  • 1
  • 2
public static void main(String[] args) throws IOException {
        // 下方为一张图片转化为 base64编码之后的字符串
        String src = "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAADw0lEQVRYR8WXW2xUVRSGv3/PaBVBYjXU1BaxijGgBKExarwU" +
                "NN5IFB/smxhCZ4aiaIzxGarRaEKMkcTpDK0SL9HYByExxhgM4ANF0QhaLw8YFas0xaQqD6btnL3MPp0mbSnNnBHLTiYzJ7POXv9a" +
                "6//X2lucoWVwMXCP4O0kWyqJ8Uy2BlcCbwpuTrLnmQSwAvhEcNHZAvAEcLfgvlkHYLAQ+AV4XLD9bAD4FhgRXJ/EebD9zxww+B" +
                "WYozEVxMtgNXAd8I5gcCZQVQMwuAk4APQIWsuObwA2A18JXqokG1UBMGgB9gI7BesN5gMvAHMFD1fieNwmMQCDG4GPgJcFWw0WA" +
                "B8CRwQbkjivigMGrwN3Ac2C4wZPAduARkH/bACwcsdbV657KEWLqiR0NSV4HmgQTAIAtAp6ZiMDy4CPgdWC7wweAt4DepPOgao4UE5" +
                "7INstQQHl59cY+71KsC9JFhKXYEKz2VJm/q6pspwVAOXItwg6DBYB72pMoolW4gxkC7a2mNOuCZm4E1gLPDNd280Ubal3DHe36eh" +
                "0yCoCkC3YQOjrI+fSsXO9/py4kcE6wRvTbZ7rtCXAHSbuB44VczqlUc0IIJu3rTgeAfImPrNo8vBqPvz+wi+WP3gsOE+JWu9odNBgRq" +
                "MTb3Vm9UH4L9dpt5nY7x3NXRl9ORHsjADa8tbiHEF21wCLTaSnRiojZKTXxB/Oc1TGj53t+m2qXbZg5j2ruto1SSUVlSARq6YxLmdyfj" +
                "GnJ08JoJLNN+ZtkXf8BGSAb0wMldIMXX4FQwM/0GBplphnKbBMYtiVeDq/SUOPdVv98CjbJNLFnOKRXRWA8FK2YIEL9wJNjI3f8U8owWE" +
                "TR5ynzzv6LvudvuOXssbEJhnPFTbq09MF+r+UYEPeru1uV18l2a0YQEzIcBBxcbQ/pyJOeMeg8ywowWLnuEqOE4WMdlfieNymcgA7bGX" +
                "KUzBYeRoHozIOejg0WsOzU/tF4hK07bBbUxY3kEgR2ydKq/1VayqlaXJGk8EFPqL3r0s41NOqKEn0wXbaDGSKtlfGXO9o7coosD/x2vyKXfjPOaxIOa4OLxdyKlasgmzBwuUiXLXqgPPDKdeMz88b4cXhGtpjBXiECydw5oXDaPl7nil+RsZ+79kXGk+maMtlPFDMqaMqGWYLNieQzTvqTNSlIg6aYpnVS/ztoV/G16U0gzVQH5WoN1Eri4MIg+pAMafQQ6rrA6ERRdDiUtxuRgtGLYovJMPhUmJiQMZJWQzmZAAloz+K2NP1qL6fqX7/AlDqSDC4Es2EAAAAAElFTkSuQmCC";

        byte[] decode = Base64.getDecoder().decode(src);
        // 将解码后的 图片保存到文件夹中
        FileOutputStream fileOutputStream = new FileOutputStream(new File("d:/img.jpg"));
        fileOutputStream.write(decode);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

参考 :

  • https://blog.csdn.net/qq_20545367/article/details/79538530
  • https://blog.csdn.net/wo541075754/article/details/81734770
  • https://www.cnblogs.com/cangqinglang/p/11100646.html
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/203063
推荐阅读
相关标签
  

闽ICP备14008679号