您现在的位置是:亿华云 > 数据库
一文带你读懂Base64编码
亿华云2025-10-03 18:23:11【数据库】4人已围观
简介本文转载自微信公众号「我是开发者FTD」,作者FTD。转载本文请联系我是开发者FTD公众号。hi,大家好,我是开发者FTD。相信很多同学在工作中,经常会用到Base64编码,那大家知道为什么会有Bas
本文转载自微信公众号「我是文带开发者FTD」,作者FTD。读懂转载本文请联系我是编码开发者FTD公众号。
hi,文带大家好,读懂我是编码开发者FTD。相信很多同学在工作中,文带经常会用到Base64编码,读懂那大家知道为什么会有Base64编码吗?编码我们为什么要使用它呢,它又是文带怎么实现的呢?下面就让我们来一起深入探究一下Base64编码吧。
Base 家族
在开始之前,读懂我们先给大家介绍一下Base家族。编码虽然我们在工作中使用最多的文带是Base64,但是读懂Base家族可不止是只有Base64,除了Base64之外,编码Base家族还有Base32和Base16。
我们都知道ASCII 编码,ASCII 编码是用256(2的8次方)个字符,对二进制数据进行编码的方式,同样的
Base64 编码是用64(2的网站模板6次方)个字符,对二进制数据进行编码的方式 Base32 编码是用32(2的5次方)个字符,对二进制数据进行编码的方式 Base16 编码是用16(2的4次方)个字符,对二进制数据进行编码的方式那Base家族有这么多编码形式,为什么偏偏使用Base64呢?
Base64 编码是用64(2的6次方)个特定的ASCII字符来表示256(2的8次方)个ASCII字符,也就是说三个ASCII字符经过Base64编码后变为四个的ASCII字符显示(公约数为24),编码后数据长度比原来增加1/3,不足3n用“=”补足。 Base32 编码就是用32(2的5次方)个特定的ASCII字符来表示256(2的8次方)个ASCII码,也就是说五个ASCII字符经过Base32编码后会变为八个ASCII字符显示(公约数为40),编码后数据长度比原来增加3/5,不足8n用“=”补足。 Base16 编码就是用16(2的4次方)个特定的源码下载ASCII字符表示256(2的8次方)个ASCII字符,也就是说一个ASCII字符经过Base16编码后会变为两个ASCII字符显示,编码后数据长度比原来增加一倍,不足2n用“=”补足。从上面可以看出Base64编码后,长度增加是最少的,这也是我们选用Base64的一个重要原因。
Base64 简介
Base64顾名思义,就是基于64个可打印字符来表示二进制数据的一种方法,「注意它并不是一种加密算法」。对于64个打印字符,我们只需要6个二进制位就可以完全表示了。那么我们如何利用8个二进制位来表示只需要6个二进制位就可以完全表示的可打印字符呢?由于2的6次方等于64,所以我们可以将每6个位元为一个单元,对应某个可打印字符。三个字节有24个位元,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示。
Base64是从二进制数据到字符的过程。所以计算机中所有的服务器租用内容,包括文本、图片、音频、视频等等都可以使用Base64编码来表示。
Base64 编码原理
Base64编码就是使用64个字符作为一个基本字符集:
小写字母a-z、大写字母A-Z、数字0-9、符号"+"、"/"(再加上作为垫字的"=",实际上是65个字符)
然后,所有其他符号都根据一定规则转换成这个字符集中的字符。
具体来说,Base64编码的转换方式可以分为以下四步:
第一步,将每三个字节作为一组,一共是24个二进制位 第二步,将这24个二进制位分为四组,每个组有6个二进制位 第三步,在每组前面加两个00,扩展成32个二进制位,即四个字节 第四步,根据下表,得到扩展后的每个字节的对应符号,这就是Base64的编码值Base64 编码的字符索引表如下所示:
数值 字符 数值 字符 数值 字符 数值 字符 0 A 16 Q 32 g 48 w 1 B 17 R 33 h 49 x 2 C 18 S 34 i 50 y 3 D 19 T 35 j 51 z 4 E 20 U 36 k 52 0 5 F 21 V 37 l 53 1 6 G 22 W 38 m 54 2 7 H 23 X 39 n 55 3 8 I 24 Y 40 o 56 4 9 J 25 Z 41 p 57 5 10 K 26 a 42 q 58 6 11 L 27 b 43 r 59 7 12 M 28 c 44 s 60 8 13 N 29 d 45 t 61 9 14 O 30 e 46 u 62 + 15 P 31 f 47 v 63 /有了这个字符索引表,我们就可以把任意的二进制转换成Base64的编码了,下面我们通过几个例子,给大家展示一下转换的过程。
1,假设现在有字符串 「FTD」 需要转换成base64的编码格式
因此字符串 “FTD” 经过Base64 编码之后就变为:RIRE 。
2,上面的例子中的字符正好是三个字节,如果字节数不足三个时该如何处理呢?下面我们以「F」 和 「FT」 分别举例说明如下:
如上表所示,由于字符F的二进制为01000110,按照每6位进行分组,此时只能分成一组,第二组缺少4位,如果位数不足时,用0补齐;第三组和第四组完全没有数据,则用**=「补上。因此,字符F经过Base64编码后得到的数值为」Rg==**。
3,下面我们再看一下如果只有两个字符的情况:
如上表所示,这个也属于位数不足,需要补位的情况。第一组和第二组按照正常的分组计算,第三组由于不足位数,最后两位补0,第四组完全没有数据,用**=「补上。因此,字符FT经过Base64编码后得到的数值为」RlQ=**。
关于中文的Base64编码
大家都知道中文编码有很多种,例如「GB2312、GBK、GB18030」,不同的汉字使用不同的编码格式进行编码后,它的二进制是不同的,所以在进行Base64编码后,他们的Base64编码的值也是不同的。这就要求我们在解码的时候需要注意原文的字符集格式,一定要保持一致才能正确解码。
例如:
中文 “【我是开发者FTD】公众号” UTF-8 格式的Base64 编码后的值是:44CQ5oiR5piv5byA5Y+R6ICFRlRE44CR5YWs5LyX5Y+3
中文 “【我是开发者FTD】公众号” GB2312 格式的Base64 编码后的值是:ob7O0srHv6q3otXfRlREob+5q9bausU=
Base64 是加密算法吗?
Base64 主要不是用来加密的,它主要的用途是把一些二进制数转成普通字符用于网络传输,这是因为一些二进制字符在传输协议中属于控制字符,不能直接在网络上传输。另外,还有一些系统中只能使用ASCII字符。Base64 编码就是用来将非ASCII字符的数据转换成ASCII字符的一种方法。Base64 并不是安全领域下的加密解密算法,虽然有时候也会经常看到所谓的Base64加密解密算法。其实Base64只能算是一个编码算法,对数据内容进行编码来适合网络传输。虽然Base64编码过后原文也变成无法直接理解的字符格式,但是这种编码方式比较初级,很简单,很容易就可以被还原成原文,所以如果有比较重要的信息需要加密,一定要使用我们之前文章中介绍的那些加密算法进行数据的安全保护。
Base64 编码实现
Java语言中有多个库实现了Base64编码,不管哪一个库,最终的结果都是一样的。
JDK 提供的 Base64 编码实现:
public static String encode(String data) { return Base64.getEncoder().encodeToString(data.getBytes()); } public static String decode(String base64Data) { return new String(Base64.getDecoder().decode(base64Data)); }Bouncy Castle 提供的 Base64 编码实现:
public static String encode(String data) { return new String(Base64.encode(data.getBytes())); } public static String decode(String base64Data) { return new String(Base64.decode(base64Data)); }Commons Codec 提供的 Base64 编码实现:
public static String encode(String data) { return Base64.encodeBase64String(data.getBytes()); } public static String decode(String base64Data) { return new String(Base64.decodeBase64(base64Data)); }下面让我们用Java语言的实现来验证一下,我们第二章节的推理是否正确吧,代码如下:
public static void main(String[] args) { String ftd = "FTD"; String ft = "FT"; String f = "F"; System.out.println("FTD base64 编码:" + encode(ftd)); System.out.println("FT base64 编码:" + encode(ft)); System.out.println("F base64 编码:" + encode(f)); }输出结果为:
FTD base64 编码:RlRE FT base64 编码:RlQ= F base64 编码:Rg==可以看到,和我们分析所得的结果是完全一样的。
查看完整代码请访问:
https://github.com/ForTheDevelopers/JavaSecurity
总结
Base64是我们在工作中经常用到,但是很少有人会深入研究一下它的实现原理,如果理解不当,甚至可能还会有人用它当做加解密用到业务系统关键位置,可能会引发比较严重的后果,相信大家看完上述的内容后,应该对Base64编码已经有了深刻的理解了吧。
很赞哦!(21578)
相关文章
- Dubbo 泛化调用在vivo统一配置系统的应用
- 3、商标域名一经注册,就可以作为域名裁决过程中的主要信息之一。这可以大大增加公司被抢注的相关域名胜诉的机会。
- 如果你的潜在终端必须是这个米(域名),那么潜在终端并不多,也没有硬通货,那么你的域名应该在终端有兴趣购买时出售。否则,你可能得自己留着吃。
- 在此期间,他们每天仍在这里卖大米,在理财方面个人感情有待提高。因为现在是收米的最佳时机。
- OCP China Day 2023开放计算生态论坛:强化生态聚合,产业链协同发展
- 换新域名(重新来过)
- 为什么喜欢国外注册域名?国外注册域名注意什么?
- 换新域名(重新来过)
- 从零开始实现一个MyBatis加解密插件
- 4、企业无形资产:通用网站已成为企业网络知识产权的重要组成部分,属于企业的无形资产,也有助于提升企业的品牌形象和技术领先形象。它是企业品牌资产不可或缺的一部分。
热门文章
- 使用数字孪生来管理可持续的数据中心
- 顶级域名可以增加企业品牌的价值。随着经济的快速发展,域名已不再是企业在网络中的独立地位。顶级域名的服务范围、企业产品、综合形象体现等,对于企业单位来说,顶级域名的重要性不言而喻。
- 在数以亿计的网站中,我们应该抓住每一个可能带来宣传的机会,域名可以带有企业的名字,一般可以使用汉语拼音或者英语单词或者是相关缩写的形式,只要用户记住了你企业的名字,就能很容易的打出你的网站域名,同样的,记住了网站域名也能很快的记住你公司的名字。
- 在数以亿计的网站中,我们应该抓住每一个可能带来宣传的机会,域名可以带有企业的名字,一般可以使用汉语拼音或者英语单词或者是相关缩写的形式,只要用户记住了你企业的名字,就能很容易的打出你的网站域名,同样的,记住了网站域名也能很快的记住你公司的名字。
站长推荐
如何处理过时的数据中心硬件?
评估域名涉及的行业规模与发展状况成正比。
公司名字不但要与其经营理念、活动识别相统一,还要能反映公司理念,服务宗旨、商品形象,从而才能使人看到或听到公司的名称就能产生愉快的联想,对商店产生好感。这样有助于公司树立良好的形象。
6、提示添加成功,点击确认进行最后的确定操作。一般10分钟就解析生效,可以用域名进行访问了。
首届超互联新算力产业暨第三届中国IDC行业DISCOVERY大会圆满召开:院士专家创业者齐聚 热议智算时代AI新趋势
换新域名(重新来过)
付款完成后,您只需耐心等待,如果您注册成功,系统会提示您。这里需要注意的是,域名是一个即时产品,只有在最终付款成功时才能预订,注册成功后不能更改。
便宜域名使用如何?小白可以买到便宜域名吗?