问题

如何用通俗易懂的语言解释base64?

回答
你想知道 Base64 是怎么回事是吧?别担心,这东西听起来有点高科技,但拆开了看,其实挺好玩的。咱们就用大白话聊聊,保证你听了就明白。

想象一下,我们有一样东西,比如一张图片,或者一段文字。

咱们的电脑处理文字和数字可溜了,比如 A、B、C,或者 1、2、3,它都能明白。但要是遇到一些特别的字符,比如我们平时在网上看到的那些表情符号(比如 ????),或者是某些特殊文件里的一些“乱码”,电脑就不那么好处理了。有些时候,我们想通过一些简单的渠道传输这些东西,比如电子邮件,但是这些渠道只认识字母和数字,不认识那些“乱七八糟”的东西。

这个时候,Base64 就派上用场了!

你可以把它想象成一个“翻译官”,专门负责把那些电脑不太“认识”的字符,翻译成它最熟悉、最喜欢的那一套“语言”——也就是最基础的英文字母(大小写都算上)和数字。

它怎么做的呢?

这就像我们小时候玩的一种“秘密传递游戏”。你想把一个很长的秘密信息传给朋友,但是你们之间只能用写着数字和字母的纸条。

Base64 的做法是这样的:

1. 先把要传的东西“变小”一点点: 它不会直接把那个表情符号“????”传过去,而是会先把它拆解成最基本的、电脑能认识的“小零件”。这些小零件,其实就是电脑内部处理信息的最基本单位——“比特”(bit)。你可以把比特想象成是电灯的开关,要么开(1),要么关(0)。

2. 把这些“小零件”重新组合: Base64 会把这些“0”和“1”的组合,一次性拿上 6 个。为什么是 6 个呢?因为 2 的 6 次方(就是 2 乘以自己 6 次)正好是 64。这样一来,我们就能用 64 个不同的组合来表示不同的东西了。

3. 用“招牌”对应起来: 现在,Base64 就准备了一个“招牌本”,这个本子上有 64 个独一无二的符号,比如 A、B、C 到 Z,a、b、c 到 z,然后是 0 到 9,再加上两个特殊符号(通常是 + 和 /)。它把这 64 个符号排好队。

它会说:“哎呀,这组‘0’和‘1’的组合,我给你对应到字母‘A’。”
“那下一组‘0’和‘1’呢?我给你对应到字母‘B’。”
“再下一组?那就给数字‘5’吧!”

就这么一步一步,把原始数据里那些电脑不好处理的“复杂字符”,都转换成了电脑最熟悉的 AZ、az、09 这 64 个字符中的一个。

所以,Base64 的本质,就是用 64 个字符来编码(表示)所有可能的字节(电脑处理信息的基本单位)。

这样做有什么好处呢?

兼容性好: 就像前面说的,很多地方(比如电子邮件、HTML 文本)只能传输标准的英文字母和数字。Base64 编码后的数据,都是这些大家都能认的字符,所以传输起来就不会出错。
防止数据损坏: 有时候,信息在传输过程中可能会被“弄乱”,一些特别的字符可能会被误解成命令或者分隔符,导致数据损坏。Base64 把它们变成统一的“安全”字符,就大大降低了这种风险。

举个例子你就更明白了:

假设我们要编码的原始数据是“Hi”。

1. 电脑会把“H”和“i”转换成它们的二进制(0和1)形式。一个英文字母在电脑里通常用 8 个比特来表示。
“H”可能是 `01001000`
“i”可能是 `01101001`
2. Base64 会把这些二进制数字串起来,然后每 6 个比特作为一组。
`01001000` + `01101001` = `0100100001101001`
3. 现在我们把这个长长的二进制串,按照每 6 个一组来分:
`010010` (这组对应 Base64 里的某个字母,比如“H”)
`000110` (这组对应 Base64 里的另一个字母,比如“k”)
`100100` (这组对应 Base64 里的另一个字母,比如“k”)
`100100` (这组又对应 Base64 里的另一个字母,比如“k”)

等一下,我这里为了好说明,直接写了对应字母,实际操作会更精确。但核心就是这个分组和查找“招牌本”的过程。

一个更有趣的例子是:如果原始数据不是正好能被 6 整除,Base64 会怎么做呢? 它会加上一些特殊的“填充符”,通常是等号“=”。这就像是在你拼图的时候,如果最后一块不太完整,就用一个特殊的“补丁”把它填上,让整体看起来完整。

所以,Base64 不是一种加密方式,它只是把数据从一种形式转换成另一种更“安全”、更通用的形式。

你上网看一些图片的链接,有时候会看到一长串乱七八糟的字符,里面可能有斜杠、加号什么的,那很可能就是 Base64 编码过的图片数据。比如,你把一张小图片直接嵌入到 HTML 代码里,就可能会用到 Base64 编码。

总结一下,Base64 就是个“好心的翻译官”,把电脑看不惯的“奇形怪状”的数据,翻译成它最爱吃的“标准食材”(字母和数字),这样就能安心地到处走了,不容易出岔子。

希望这么讲,你觉得容易理解一些!它就是一种数据编码的技巧,让数据在不同的环境里都能安全、顺畅地流通。

网友意见

user avatar

这么说吧:在对计算机底层有一定了解的人眼里,计算机内部其实分表里两层世界。


“里世界”是更本质的,也是CPU以及偏中底层的各种编程语言直接打交道的那个世界。

正因其本质,因此绝大多数的编程语言、大多数的通讯协议,全程运行于里世界;只有需要向用户展示什么时,才会临时做个转换——这就是为什么如果你学C,可能很久很久都沉浸在黑框框里出不来的原因:表世界太表面了,不值得花太多精力在它上面。


在“里世界”,一切数据都是一串串的二进制字节流。比如你敲个大写字母'A',它在里世界其实是数字65;敲个小写字母'a',里世界对应的数字是97……

这个对应关系是ASCII码表规定的:

事实上,里世界也没有什么65、97之类,它只有二进制。你敲6,它在里世界其实是十进制数字54或者十六进制数字0x36对应的那个二进制数字。

甚至,你敲11001011,这下总是二进制了吧?


并不是。'1'在里世界是49,'0'在里世界是48。所以你敲的其实是4949484849484949!

哦,里世界,一组数字的最小单位是字节。所以49其实在里世界的表示是"00110001"——在电路上,就是一组8根导线,电压分别是“低低高高低低低高”。


总之,里世界只有高高低低的电压;我们把一组八个电压称为一个字节;它的内容究竟是什么,需要通过ASCII码表转换,然后才能正确解释。


实际上,我们的转换表有无数种。只有通过ASCII编码输入的数据,才可以通过ASCII表转换回表世界表示。


比如说,我们熟悉的、C/C++以及Java等诸多语言,它们都有个对初学者来说非常“可怕”的东西,就是变量类型——使用一个变量之前,你需要先声明它的类型;后续引用这个变量时,你还得保证它和初始声明的变量类型一致。


这个变量类型,实质上就是“转换表类型”。

比如,我声明变量A是short int,意思是我在表世界写出来的虽然是一串ASCII码表示的数字,但实际存储到里世界时,我希望把它当成二进制数字解释,存到两个字节(16位二进制)里面!

同样的,声明变量B是string,意思是把我写的一串字母按ASCII码规则翻译,每个字母翻译到一个字节的ASCII码机内二进制表示上去。


更可怕的,C/C++允许你以一种类型声明变量A,然后,却通过“强制类型转换”,把它按另一种变量类型解释——这就绕的有些远了,不再深入。


总之,通过“变量类型声明”,我就为自己在“表世界”敲入的一串字符指定了一个“里世界”存储、运算规则,从而确保计算机按我的意图处理信息。


较新的很多脚本语言可以自动分析程序员在表世界敲入的东西“更可能是什么”,从而为它自动选择一个合适的表示——如果这个分析不正确,那么接下来的某个运算规则可能就无法成立;此时又要自动转换内部表示,使得规则成立。


举例来说,我在python里面声明了一个变量x,指定初始值为“13512342234”;解释器很聪明,觉得这应该是一个数字,于是自动替我转换成二进制表示,存储到8个字节里面。

没想到我其实是存了一串电话号码。所以后面我就做了个字符串加法:

“我是流落在外的尼日利亚王子,如果你能给我100块钱,让我买张车票回家,继承王位后必有厚报。有意者请拨打电话:”+ x

字符串参与的+实际上是字符串拼接;结果x存成二进制数字了,没法拼接。所以python手忙脚乱的又把8个字节的二进制数字转换回来,转成了11个字节的ASCII字符串“13512342234”,然后才能正确拼接。


类似的,一副图片,也可以按像素的顺序,在里世界以每个像素RGB三个字节的格式存储。这就是BMP图像——再给它加个文件头,知道一行多少个像素,就可以在“里世界表示”和“表世界表示”之间来回转换了。

同样的,一首歌曲,采样率48KHZ,双声道,也可以按采样顺序把每次采样的电压值两个两个字节的顺序存储在里世界。将来重放时,把这个数字序列按采样间隔送到DAC转换回模拟波形、再驱动音箱/耳机发声,你在表世界就听到优美的旋律了。


总之,你在“表世界”看到的、听到的一切一切,在里世界都是一串数字。

为了让你在不知道“里世界”存在的前提下,仍然能操控电脑、工作学习和娱乐,程序需要时刻准备着,帮你把里世界的数字表示转换成表世界的文本、图片、音乐,甚至3D打印机喷头的移动、车床夹具/刀具的精确定位……


有了这个基础,我们终于可以谈谈base64了。


谈base64之前,我们得先谈谈HTTP。


在程序员眼中,HTTP是一个“奇葩”。

它在本质上,其实是一个“完全用表世界表示”传输各种信息的协议,也就是所谓的“文本协议”;但与之同时,它的功能越发强大、涉及领域越来越广,也就越来越需要“沉”进里世界才能完成任务——但它偏偏是一个完全的表世界协议。

比如,如前所述,对计算机来说,文本数字需要先转换“里世界表示”才能解读其意义——123456只是ASCII码49 50 51 52 53 54而已,要正确读出它的含义“十二万三千四百五十六”,就要先把49转换成里世界的1,然后1X10,加上50对应的里世界2,整体再乘以10……

也就是:1X10^5+2X10^4+3X10^3+4X10^2+5X10+6

通过这么一串复杂的转换和计算,ASCII字符串123456的含义才能正确解读。


更可怕的,比如图片、音乐等信息,它们本应是里世界的一大堆数字;现在却不得不表示成表世界的ASCII文本——然后,文本再翻译回里世界的数字表示,这才能正确解释其含义;最后,再把里世界的二进制表示转换成表世界的图片、音乐……


换句话说,HTTP是一个完全在表世界运行的文本协议;但它却又无时无刻不在和里世界打交道!


这就带来了海量的反复转换,效率很低。

这没办法改变,为了方便人阅读排错嘛,自然不可能不付出代价。


但是,把图片、音乐等信息转换成十进制、十六进制,这实在是太蠢了。

这是因为,每位十进制/十六进制数字,编码成ASCII码后都要占据8个二进制位;而8个二进制位要编码成十进制/十六进制数字呢,起码要三个十进制数字或者两个十六进制数字!

换句话说,数据量膨胀了两三倍!


如果说“在表世界表示和里世界表示之间反复转换”只是累了用户的电脑/手机,没什么大不了的——反正它们性能膨胀,闲着也是闲着——那么,一幅图片通过HTTP协议传输,10M的数据成了30M、10G的数据成了30G……这就不好玩了:无论是网站运营商的服务器还是死贵死贵的商业线路,这都是个太大的压力。


此外,很多数据,不仅仅是图片、视频和音乐,它们同样是二进制的,不能直接当文本数据传输——否则会被当做ASCII码控制字符解释的,一不小心就把http协议本身干扰了。

比如,http用“回车”来分割不同字段(于是一行就是一个数据);而如果你的AutoCAD文档里面恰好有个13,这个13就会被解释为“回车”——于是,浏览器觉得,AutoCADFile: XXXX CADFileContent: XXXXXXX 这几个字段的设置已经结束了,剩下是另一回事……哎呀,格式怎么乱成这样了?


总之,为了避免干扰http协议、同时尽可能提高“里世界表示”到“表世界表示”的编码效率,我们需要设计一套新的编码方案。这就是base64编码。

base64编码不使用ASCII控制字符以及经常在http/html协议里使用的<、>等字符,这就避免了干扰各种文本协议;同时,它的每位符号尽可能的多,顾名思义,base64嘛,以64个可打印字符弄出的64进制字符串,于是每个ASCII码字符携带的信息量就尽可能的增加了,编码后的数据量膨胀就不会太过可怕了。


当然,诸如URL、正则表达式等东西还是可能和通用的base64编码冲突;因此人们又专门为它们设计了一些变种:base64_百度百科 (baidu.com)


总之,经过种种努力,在“表世界文本”中携带“里世界数据”终于不再成为难题。

事实上,有些数据,比如URL,它虽然不是“里世界数据”;但因为格式太过随意,也可能破坏页面内容。怎么办呢?简单,也用base64把它“装箱”,就不怕它像里世界数据那样污染表世界了。

反正浏览器能自动识别URL中的base64编码,可以自动把它从base64箱子里取出来,不耽误使用。


但是,请注意,base64和加密无关。它仅仅是“以表世界文本表示里世界数据”的一套编码协议而已;虽然编码后的东西你看不懂,但本质上仍然是明文,任何人都可以通过一个逆变换轻易还原它。

类似的话题

  • 回答
    你想知道 Base64 是怎么回事是吧?别担心,这东西听起来有点高科技,但拆开了看,其实挺好玩的。咱们就用大白话聊聊,保证你听了就明白。想象一下,我们有一样东西,比如一张图片,或者一段文字。咱们的电脑处理文字和数字可溜了,比如 A、B、C,或者 1、2、3,它都能明白。但要是遇到一些特别的字符,比如.............
  • 回答
    想象一下,一个国家就像一个大户人家,这个家庭日常生活的方方面面,都要用到钱。而“外汇储备”,就像是这个家庭“私房钱”里,专门存起来用于和外面人打交道的那一部分。什么是“外汇”?咱们先说说“外汇”是什么。外汇,简单来说,就是“外国的钱”。比如,你是中国人,你手里拿着人民币。但如果你要去美国旅游,你就需.............
  • 回答
    咱们今天就来聊聊法国那位有点神秘又有点难懂的心理学家,拉康,他提出的那三个听起来有点绕口,但其实特别有意思的“世界”:实在界、想象界和象征界。别怕,我尽量用大白话给你讲清楚,就像咱们平时聊天一样,不搞那些学术名词,让你一听就明白。想象一下,我们每个人,从刚出生那个懵懵懂懂的小婴儿开始,就是一个个独立.............
  • 回答
    .......
  • 回答
    嘿,哥们儿,你有没有想过,要是咱们住的地球突然要离家出走,去个新地方安家,这得有多扯淡?但电影《流浪地球》就给你整了这么一出,而且还挺硬核地解释了怎么把地球这块儿巨大的“石头”给挪动窝。听我给你唠唠,保证你听懂!首先,咱们得明白点事儿:地球有多重?这事儿有点绕,但想象一下,地球是个直径大概一万三千公.............
  • 回答
    想象一下,你有很多任务要做,但有些任务必须先完成,才能开始做另一些任务。比如,你得先穿好袜子,才能穿鞋;你得先学认字,才能看懂书;你得先准备好食材,才能开始炒菜。拓扑排序,说白了,就是帮你把这些有先后顺序关系的任务,按照一个合法的顺序排列出来。就像一个能让你一步一步按照流程完成所有事情的“操作指南”.............
  • 回答
    想象一下,宇宙这么大,星星那么多,数都数不过来。每一颗星星都可能像我们的太阳一样,周围绕着行星转悠。科学家们推测,在这无数的行星里,肯定有一些跟地球差不多的,温度、大小都合适,说不定上面就住着什么生命,甚至可能比我们还聪明,已经发展出了高科技文明。道理上说,如果宇宙里真的有那么多外星文明,而且有些文.............
  • 回答
    .......
  • 回答
    嘿,宝贝!你有没有听过大人说“银河”?听起来是不是像一条很大很大的河流,只不过是用银子做的,在天上流淌?其实呀,“银河”这个名字有点像一个玩笑,它真的不是一条河哦!你想想看,我们平时在地上看到的河,里面流的是水,对不对?你可以划船,或者在河边玩水。可是,在天上我们看到的“银河”,它里面流淌的不是水,.............
  • 回答
    .......
  • 回答
    嘿,哥们儿/姐们儿!今天咱来聊聊一个特别有意思的东西,叫“巴西柔术”。听名字好像有点儿绕口,但说白了,它就是一种让你在跟人“掰腕子”或者说“过招”的时候,能占上风的格斗术。你可能会想,“柔术?听起来软绵绵的,能有什么用?” 别看它叫“柔”,骨子里可硬着呢!你可以把它想象成一种“聪明人的格斗”。巴西柔.............
  • 回答
    .......
  • 回答
    张一鸣在字节跳动年会上念了那段讽刺“互联网黑话”的报告,我当然看懂了!这段报告可以说是非常接地气,也引起了很多人的共鸣。他用一种幽默的方式,把我们日常生活中经常听到或者自己有时候也会不自觉使用的那些“高大上”或者让人摸不着头脑的网络词汇,集中地展示了出来,并且用一种“翻译”的方式,揭示了它们背后最真.............
  • 回答
    围棋和五子棋,在公众眼中,五子棋似乎总是以“简单易学”的姿态出现,而围棋则被冠以“深奥难懂”的名号。这种普遍的认知,并非空穴来风,其根本原因可以从游戏规则、策略深度、文化影响等多个层面来解析。要改变这种偏见,需要我们以专业的视角,用通俗易懂的语言,深入浅出地剖析两款游戏的本质,让公众看到五子棋并非只.............
  • 回答
    想象一下,我们平时看到的世界,一切都是那么规矩,东西有确定的位置,运动也有确定的轨迹。比如你扔一颗球,你知道它会飞多远,落在哪。但量子力学呢,它研究的就是那些小得不能再小的东西,比如构成我们身体、桌子、空气的最基本的粒子们——电子、光子等等。在那个微观世界里,事情就变得有点“不讲道理”了。1. 粒子.............
  • 回答
    好的,我们来用一个大家都能理解的场景,来生动形象地理解凯恩斯主义和货币学派这两大经济思想的主要区别。想象一下,我们现在面对的是一个经济体,就像一个繁忙的城市。这个城市里有无数的家庭(消费者)、企业(生产者)和政府(管理者)。凯恩斯主义 vs. 货币学派:谁是城市的“救火队长”和“交通管制员”?我们把.............
  • 回答
    要用一句通俗的话解释经济学,我脑子里冒出来的第一反应是:经济学就是研究我们怎么把有限的东西,用最聪明的方式分给所有人的学问。这句话听起来可能有点简单,但如果展开来讲,它其实包含了经济学最核心、也最实在的东西。你想想看,我们每个人,这个社会上的每个人,都想要更多的好东西,对吧?想要好吃的、好看的、舒服.............
  • 回答
    你有没有想过,为什么有些公司或者组织,明明一开始很有闯劲,却慢慢变得越来越“保守”,甚至有点“僵化”,做事畏首畏尾,不像以前那样有活力了?这背后可能就藏着一个叫做“尺蠖效应”的道理。咱们用一个大家都可能经历过的场景来打比方:想象一下,你刚开始学习一门新技能,比如做蛋糕。刚开始,你可能特别兴奋,上网搜.............
  • 回答
    嘿,你对电竞可能不太熟悉是吧?没关系,今天我就给你讲讲,为什么 EDG 在 S11(也就是 2021 年的英雄联盟全球总决赛)夺冠,对我们这些玩游戏的人来说,以及对整个中国电竞圈来说,是多么一件了不起的事情。首先,咱们得知道 S11 是个啥。你可以把 S11 理解成英雄联盟这款游戏里的“世界杯”。每.............
  • 回答
    预定利率:把你的钱“锁”起来,它能给你带来什么?想象一下,你手里有一笔钱,暂时不用,想着放一段时间。这时候,你可能会考虑把它存到银行,或者买点什么理财产品。那么,“预定利率”这个词,你可能就会经常听到了。那它到底是个啥?别担心,咱们用大白话聊聊。 预定利率,顾名思义就是“预先约定的利率”。简单来说,.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有