什么是Base64,应用场景有哪些

我们经常在工作中听到类似的东西。加密,解密,编码,解码之类的字眼。其实很多同学,特别是转行培训出来的在这个时候往往是装聋作哑的,为什么呢? 因为不知道啊,而且很多人也不知道。很多兄的的工作焦虑就是从这里来的。

下来也不利用业余时间充电,那么就会被行业慢慢淘汰。所以咱们不能好高骛远,把基础学好。以后不说大富大贵,过上中产生活还是没什么大问题。

什么是Base64:

对字符编码不太了解得同学可以先去看看我的博客:深入浅出:java开发中,字符集编码详解.

我们知道,计算机不认识我们人类的语言。比如”张三“这样一个字符串,计算机认识吗?不认识。 计算机只认识0和1。 那么怎么办呢?

  1. 我们认识”张三“,
  2. 计算机认识0和1。

有了这两个条件,人类就发明了一种方式:字符集编码 来规范和规定了人类和计算机之间的交流。
随着历史的推进,和各种人类语言的加入,字符集编码也拥有不少的版本。比如UTF-8、GBK等等。。。

但是人们渐渐的发现了两个问题,在网络数据传输的时候

  1. 网络传输只能传输可打印字符(在ASCII码中规定,0-31、128这33个字符属于控制字符,32~127这95个字符属于可打印字符,也就是说网络传输只能传输这95个字符,不在这个范围内的字符无法传输)
  2. 安全性,数据人人可见人人可解读,那还有什么安全可言呢?

这个时候Base64就站出来了。
Base64立马就解决了这两个问题。

  1. 文件传输的时候,会产生很多不可打印字符,网络传输不支持不可打印字符。 Base64将所有数据编码为可打印字符,完成了网络传输。
  2. 将文件明文通过编码(加密)成为不可一眼就可看懂的字符串,形成了一个弱弱的但不可或缺的加密操作。

这里我们不过多讲述Base64底层是如何编码的,简单的帖一张Base64的转换表: Base64、Base64那么肯定是64个字符:

在这里插入图片描述

Base64到底是加密,还是编码:

这个问题可以说是见仁见智。
我个人觉得Base64主要作用是兼容了ASCII系统和非ASCII系统之间的网络交易。 并且解决了网络传输中的”不可打印字符“问题
要说它加密没有,那确实是加密了,但属于是人人都可以破解的简易加密。所以我们在程序开发中,真正对数据加密的时候一般不使用Base64。(人人都知道如何解密的算法就不能称之为加密算法)

Base64应用场景:

其实很多时候我们都在用Base64。这里我就举一个我实际项目中使用到的一个例子:

  1. 项目中 我们把一些比较小的图片保存在数据库中,用一个字段来保存。
    但是呢,前端页面有时候会需要展示这些图片到页面上。 我们直接返回数据库中保存的数据有时候会出现问题(网络不能传输不可打印字符)。这个时候我们后端把文件数据返回前端的时候需要将数据转换为Base64编码后的字符串。 好! 这个时候前端就能自动解析并把图片展示出来。

  2. URL编码
    2.1. 我们都知道,http请求,在解析参数时是根据?和=号去解析的。那么当key value中包含=号时,参数解析就会错误。
    2.2. 还有当url出现汉字时,会自动编码。
    所以如果http传输URL中有汉字,就必须编码后使用。但是麻烦的是 标准的国际组织并没有规定具体的编码方法,而是交给应用程序(浏览器)自己决定。 这导致"URL编码"成为了一个混乱的领域。

把要编码的字符转成16进制字符,前加%。所以看到很多%,就可以判断是url编码!

java 开发中使用Base64:

直接拷贝使用即可:

import java.io.UnsupportedEncodingException;
import java.util.Base64;

/**
 */
public class JavaBase64Util {
    public static final String UTF_8 = "UTF-8";
    public static Base64.Encoder encoder;
    //即为安全的编码方式,替换“+” “/” “-”为“_”
    public static Base64.Encoder urlEncoder;
    public static Base64.Decoder decoder;
    public static Base64.Decoder urlDecoder;

    static {
        encoder = Base64.getEncoder();
        urlEncoder = Base64.getUrlEncoder();
        decoder = Base64.getDecoder();
        urlDecoder = Base64.getUrlDecoder();
    }
    //encode
    public static byte[] encode(byte[] bytes) {
        return encoder.encode(bytes);
    }

    public static String encode(String string) {
        byte[] encode = encode(string.getBytes());
        try {
            return new String(encode, UTF_8);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return null;
    }
    public static String encode2String(byte[] bytes) {
        return encoder.encodeToString(bytes);
    }
    public static byte[] encode2Byte(String string) {
        return encode(string.getBytes());
    }

    //urlEncoder
    public static byte[] urlEncode(byte[] bytes) {
        return urlEncoder.encode(bytes);
    }
    public static String urlEncode(String string) {
        byte[] encode = urlEncode(string.getBytes());
        try {
            return new String(encode, UTF_8);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return null;
    }
    public static String urlEncode2String(byte[] bytes) {
        return urlEncoder.encodeToString(bytes);
    }
    public static byte[] urlEncode2Byte(String string) {
        return urlEncode(string.getBytes());
    }
    //decode
    public static byte[] decode(byte[] bytes) {
        return decoder.decode(bytes);
    }
    public static byte[] decode2Byte(String string) {
        return decoder.decode(string.getBytes());
    }
    public static String decode2String(byte[] bytes) {
        try {
            return new String(decoder.decode(bytes),UTF_8);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return null;
    }
    public static String decode(String string) {
        byte[] decode = decode(string.getBytes());
        try {
            return new String(decode, UTF_8);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return null;
    }
    //urlDecode
    public static byte[] urlDecode(byte[] bytes) {
        return urlDecoder.decode(bytes);
    }
    public static byte[] urlDecode2Byte(String string) {
        return urlDecode(string.getBytes());
    }
    public static String urlDecode2String(byte[] bytes) {
        try {
            return new String(urlDecode(bytes),UTF_8);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return null;
    }
    public static String urlDecode(String string) {
        byte[] decode = urlDecode(string.getBytes());
        try {
            return new String(decode, UTF_8);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return null;
    }
}
  • 9
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

易柏州Innovation

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值