-
Base64编码
2018-11-15 11:11:20Base64编码 文章目录Base64编码一、Base64是什么?二、Base64怎么用?三、Base64的相关点参考博文 一、Base64是什么? Base64是一种用64个字符来表示任意二进制数据的方法。它是一种编码方式,而非加密方式。它...Base64编码
一、Base64是什么?
Base64是一种用64个字符来表示任意二进制数据的方法。它是一种编码方式,而非加密方式。它通过将二进制数据转变为64个“可打印字符”,完成了数据在HTTP协议上的传输。
什么情况下我们会用到Base64呢?Base64一般用于在HTTP协议下传输二进制数据,由于HTTP协议是文本协议,所以在HTTP协议下传输二进制数据需要将二进制数据转换为字符数据。然而直接转换是不行的。因为网络传输只能传输可打印字符。
什么是可打印字符?在ASCII码中规定,0-31、128这33个字符属于控制字符,32-127这95个字符属于可打印字符,也就是说网络传输只能传输这95个字符,不在这个范围内的字符无法传输。那么该怎么才能传输其他字符呢?其中一种方式就是使用Base64。
Base64,就是使用64个可打印字符来表示二进制数据的方法。这64个字符中包括大小写字母、数字、+和/,还有用来补缺的特殊字符=。
注意:由于base64编码用了8位字符来表示信息中的6个位,所以base64编码字符串大约比原始值扩大了33%。
Base64的索引与对应字符的关系如下表所示:
也就是说,如果将索引转换为对应的二进制数据的话需要至多6个Bit。然而ASCII码需要8个Bit来表示,那么怎么使用6个Bit来表示8个Bit的数据呢?6个Bit当然不能存储8个Bit的数据,但是4×6个Bit可以存储3×8个Bit的数据啊!如下表所示:
可以看到“Son”通过Base64编码转换成了“U29u”。这是刚刚好的情况,3个ASCII字符刚好转换成对应的4个Base64字符。但是,当需要转换的字符数不是3的倍数的情况下该怎么办呢?Base64规定,当需要转换的字符不是3的倍数时,一律采用补0的方式凑足3的倍数,具体如下表所示:
每6个Bit为一组,第一组转换后为字符“U”,第二组末尾补4个0转换后为字符“w”。剩下的使用“=”替代。即字符“S”通过Base64编码后为“Uw==”。这就是Base64的编码过程。
如果要编码的二进制数据不是3的倍数,最后会剩下1个或2个字节怎么办?Base64用\x00字节在末尾补足后,再在编码的末尾加上1个或2个=号,表示补了多少字节,解码的时候,会自动去掉。
这是字节的位总数不是6的倍数的情况,当剩下4位时,我们需要补2个=凑齐8的倍数;当剩下的是2位时,我们需要补齐1个 = 抽泣8的倍数。
二、Base64怎么用?
Java已经替我们写好Base64的实现细节,使用的时候直接调用即可。具体代码如下所示:
package com.first; import org.junit.Test; import java.io.UnsupportedEncodingException; import java.util.Base64; public class Test { @Test public void test() throws UnsupportedEncodingException { // 编码 String encode = Base64.getEncoder().encodeToString("So".getBytes("UTF-8")); System.out.println(encode); // 解码 byte[] decode = Base64.getDecoder().decode(encode); System.out.println(new String(decode, "UTF-8")); } }
三、Base64的相关点
- 首先这算法是编码,不是压缩,编码后只会增加字节数;字节数会成为原字节数的4/3;
- 算法简单, 几乎不会影响效率;
- 算法可逆, 解码很方便, 不用于私密信息通信;
- 虽然解码方便, 但毕竟编码了, 肉眼还是不能直接看出原始内容;
- 加密后的字符串只有[0-9a-zA-Z+/=],不可打印字符(包括转移字符)也可传输;
参考博文
-
BASE64编码
2016-04-12 15:04:25BASE64编码 参考文章 概述 编码方法 例1 例2 Base64编码表BASE64编码参考文章 base64 百度百科 base64 在线编/解码 概述Base64是一种用64个字符来表示任意二进制数据的方法。Base64编码要求把3个8位字节(3*8=24)...BASE64编码
参考文章
概述
Base64是一种用64个字符来表示任意二进制数据的方法。Base64编码要求把3个8位字节
(3*8=24)
转化为4个6位的字节(4*6=24)
,之后在6位的前面补两个0,形成8位一个字节的形式。 如果剩下的字符不足3个字节,则用0填充,输出字符使用=
,因此编码后输出的文本末尾可能会出现1或2个=
。本质上,牺牲存储空间以实现减少编码个数。
编码方法
例1
- 原始数据
byte 0 byte 1 byte 2 s 1 3 - 转成ascii
byte 0 byte 1 byte 2 115 49 51 - 转换2进制
byte 0 byte 1 byte 2 01110011 00110001 00110011 8个一组,也就是01110011**00110001**00110011
- 重新分组
组 0 组 1 组 2 组 3 011100 110011 000100 110011 6个一组,也就是**011100**110011**000100**110011
- 补0
组 0 组 1 组 2 组 3 0011100 00110011 00000100 00110011 也就是**00**011100**00**110011**00**000100**00**110011
- 转成ascii
byte 0 byte 1 byte 2 byte 3 28 51 4 51 - 查Base64编码表
byte 0 byte 1 byte 2 byte 3 c z E z 例2
- 原始数据
byte 0 1 - 转成ascii
byte 0 49 - 转换2进制
byte 0 00110001 8个一组,也就是00110001
- 重新分组
分组时,不够6个组的右边补0
组 0 组 1 001100 010000 6个一组,也就是**001100**010000
- 补0
组 0 组 1 00001100 00010000 也就是**00**001100**00**010000
- 转成ascii
byte 0 byte 1 12 16 - 查Base64编码表
byte 0 byte 1 M Q 输出数据需要是4的倍数,输出补
=
。也就是结果修正为:byte 0 byte 1 byte 2 byte 3 M Q = = 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编码
2016-11-28 11:11:10base64编码的目的 base64编码的目的是将字符串中含有的不可见字符用可见字符表示出来,以便复制粘贴。 例如电子邮件的附件一般使用Base64编码,因为附件数据往往含有不可见字符。base64原理 base64的主要思想是将...base64编码的目的
base64编码的目的是将字符串中含有的不可见字符用可见字符表示出来,以便复制粘贴。
例如电子邮件的附件一般使用Base64编码,因为附件数据往往含有不可见字符。base64原理
base64的主要思想是将输入的字符串或数据编码成只含有{‘A‘-‘Z‘, ‘a‘-‘z‘, ‘0‘-‘9‘, ‘+‘, ‘/‘}这64个可打印字符的串,故称为“Base64”。
Base64编码的方法是,将输入数据流每次取6 bit,用此6 bit的值(0-63)作为索引去查表,输出相应字符。这样,每3个字节将编码为4个字符(3×8 → 4×6);不满4个字符的以‘=‘填充。base64编码/解码帮助类
using System; using System.Text; namespace Helper { public class Base64Helper { public static string GetString(string base64String, Encoding encode) { byte[] byteArray = Convert.FromBase64String(base64String); return GetString(byteArray, encode); } public static string GetBase64String(string inputString, Encoding encode) { byte[] byteArray = GetBytes(inputString, encode); return Convert.ToBase64String(byteArray, 0, byteArray.Length); } public static string GetString(byte[] byteArray, Encoding encode) { return encode.GetString(byteArray); } public static byte[] GetBytes(string inputString, Encoding encode) { return encode.GetBytes(inputString); } } }
string base64String = Base64Helper.GetBase64String("tt", ASCIIEncoding.Default);//base64String = "dHQ="; string commonString = Base64Helper.GetString(base64String, ASCIIEncoding.Default);//commonString = "tt";
-
Base64 编码
2010-02-23 16:28:00Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,在发送电子邮件时,服务器认证的用户名和密码需要用Base64编码,附件也需要用Base64编码。下面简单介绍Base64算法的原理,由于代码太长就不在此贴出Base...Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,在发送电子邮件时,服务器认证的用户名和密码需要用Base64编码,附件也需要用Base64编码。
下面简单介绍Base64算法的原理,由于代码太长就不在此贴出
Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。
转换后,我们用一个码表来得到我们想要的字符串(也就是最终的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 (pad) =
15 P 32 g 49 x
16 Q 33 h 50 y
原文的字节最后不够3个的地方用0来补足,转换时Base64编码用=号来代替。这就是为什么有些Base64编码会以一个或两个等号结束的原因,但等号最多只有两个。
举一个例子,abc经过Base64编码以后的结果是YWJj.
发邮件的时候所写的信息自动在后台转换然后传输... -
一篇文章彻底弄懂Base64编码原理
2018-08-16 07:42:09目前Base64已经成为网络上常见的传输8Bit字节代码的编码方式之一。在做支付系统时,系统之间的报文交互都需要使用Base64对明文进行转码,然后再进行签名或加密,之后再进行(或再次Base64)传输。那么,... -
获取图片的base64编码以及根据base64编码生成图片
2020-05-18 09:36:12说明:什么是base64编码呢?百度百科上面给出的解释是这样的: Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。可查看RFC2045~RFC2049,上面... -
将pdf的base64编码格式转为img的base64编码格式
2020-07-09 13:37:47通过pdf的base64编码格式直接转为img的base64编码格式: public static String base64PdfToJpgBase64(String base64Pdf) { if (StrUtil.isEmpty(base64Pdf)){ return null; } String jpg_base64 = null; int ...