诚心请教关于 base64 的问题

2020-11-03 16:44:15 +08:00
 Chaox

一直很疑惑 base64 的作用。我们传输文件不管是文本文件还是二进制文件最后都是二进制,文本文件只是对二进制的一种处理而显示出文本。 传输文件时,如果我们是用 ASCII 码传输,传输到对方后,对方也有 ASCII 码解释就可以了。其他编码如 UTF-8 之类也是如此。为什么需要 base64 ?

在网上看到这么一段话:

我们知道在计算机中任何数据都是按 ascii 码存储的,而 ascii 码的 128 ~ 255 之间的值是不可见字符。而在网络上交换数据时,比如说从 A 地传到 B 地,往往要经过多个路由设备,由于不同的设备对字符的处理方式有一些不同,这样那些不可见字符就有可能被处理错误,这是不利于传输的。所以就先把数据先做一个 Base64 编码,统统变成可见字符,这样出错的可能性就大降低了。

这里为什么不同设备处理方式会有不同呢,传输过程中不都是二进制吗,直接把二进制传给对方不就可以了?

4919 次点击
所在节点    程序员
41 条回复
lmmortal
2020-11-04 10:26:37 +08:00
@Bromine0x23 不太懂,FFFFFF 这个 24 比特转换成 base64 之后长度更长了,有 8 个(MTEx),按这样算起来 base64 像是 3bit
aneostart173
2020-11-04 10:33:20 +08:00
二进制对流传输协议不太友好,因为什么编码都可能用,控制字符出现的概率就高了。文本传输就规定了大家只能用这么些字符,协议就容易定,剩下的字符留给下一层当控制字符用。
FreeEx
2020-11-04 10:38:12 +08:00
原因就是有些字符使用 ASCII 无法表示,Base64 就是用来解决这个的。
通常一个数据对象可以序列化为一个 byte 数组,1byte=8bit,ASCII 的表示范围是从 0000 0000 到 0111 1110,局限在于只能显示 26 个基本拉丁字母、阿拉伯数字和英式标点符号,因此只能用于显示现代美国英语。Base64 则是用长度为 64 的索引表来对应 6bit 的 00 0000 到 11 1111,不把 byte 看成一个整体,而是拆开 bit 之后按 6 位一个来表示,bit 总长度不能被 6 整除的时候就在后面补 0,补 6 个 0 的时候后面增加一个=,补两个 0 的时候增加两个=,这样就可以用有限的字符来表示各种各样的复杂数据了。
GM
2020-11-04 10:47:57 +08:00
@lmmortal

你搞错了,你说的 FF 那已经是二进制了,不叫 hex 了。

11111111 的 hex 是 3131 3131 3131 3131,总共 16 个字节,base64 是 MTExMTExMTEK,13 个字节
wanguorui123
2020-11-04 10:55:52 +08:00
1 、部分二进制数据(加密、压缩、音频、图片、视频等算法处理后的二进制数据)方便存储为文本方便复制粘贴、存储、传输
2 、在部分协议里为了兼容协议的解析规则逼不得已用 Base64 或 HEX 文本进行特殊符号编码
SuperMild
2020-11-04 11:03:48 +08:00
@lmmortal hex 其实是 Base16 的别称,hex 不等同于 16 进制。
nuk
2020-11-04 11:26:58 +08:00
咳,因为 internet 出现前,用的 uucp 网络啊,里面一部分 ASCII 是作为控制字符使用的
不过没有选 uuencode 大概是因为有空格吧?
shawndev
2020-11-04 11:35:47 +08:00
base64 不是只有>=128 的字符不可显示。比如 0x00 是终止符也不可显示。
shawndev
2020-11-04 11:36:46 +08:00
有些场景下限定字符有特殊含义,比如 URL 中 /和=有特殊用途,分别代表 path 和 query,那么编码后的 ascii 如果有这些值就会影响 url 的解析。
Chaox
2020-11-04 11:48:30 +08:00
@xx6412223 也就是说 比如 应用层的数据如果要给传输层,不过不转换成 base64 编码,有些数据比如换行等没办法被正确识别。是这个意思吗?
Chaox
2020-11-04 11:53:51 +08:00
@shawndev 那直接把这些字符变为二进制( ASCII )不就不会影响了吗
shawndev
2020-11-04 11:58:31 +08:00
@Chaox 上面打错了,ascii 不是只有>=128 的字符不可显示。你如果了解 utf8 编码就不会问为什么不用 utf8 对数据解码形成文本,因为不是所有 bytes 都能转成 utf8 string
kuro1
2020-11-04 12:00:09 +08:00
btc 还用 base58 呢,一套编码罢了( ipfs 最近还用 base32
shawndev
2020-11-04 12:02:35 +08:00
lmmortal
2020-11-04 12:15:55 +08:00
@SuperMild 谢谢
@GM 确实搞错了,谢谢
imn1
2020-11-04 12:32:13 +08:00
不知道这句话是何时何地看到的
如果语境不同,路由设备所指的可能也不同,如果中间有个设备是指语义防火墙,是无法保证任意数据 AB 两地一致的,只能降低“出错的可能性”
ggabc
2020-11-04 12:33:17 +08:00
base64 的重要意义就是把各种字符都统一用 64 个基础字符(实际并不是刚好 64,别纠结这个)表示了,用来简化传输难度,传输完成后还原回去用。
图片可以 base64,汉字可以 base64,ascii 字符也不冲突照样可以 base64 编码解码一下
xiangyuecn
2020-11-04 12:39:36 +08:00
base64 之后 还可以 base64,无限套娃,气不气人
hitmanx
2020-11-04 13:09:54 +08:00
no1xsyzy
2020-11-04 13:13:43 +08:00
所以说
0b11111111

"11111111"
要好好区分啊……

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/721443

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX