为什么有的代码要用 base64 进行编码?

我不认为这是加密,因为 base64 本身的可逆的,所以谈不上加密。
所以,大家用 base64 进行编码时,是出于什么目的?

阅读 29k
11 个回答

Base64主要用于将不可打印的字符转换成可打印字符,或者简单的说将二进制数据编码成ASCII字符。

将二进制数据编码成ASCII字符主要的目的是能在纯文本内容中插入二进制数据,常见的应用场景包括:

  1. 电子邮件

    这个可参考阮一峰的《MIME笔记》

  2. 微软的MHT格式

    这是模仿邮件格式将多种资源打包在一个文件中的格式,所有二进制资源都采用 Base64 编码。

  3. XML文件

    这是一个纯文本文件,如果要基于 XML 格式设计可以保存图片或其它附件的数据格式,那就需要将这些二进制数据转码成 ASCII 字符。

  4. DATA URL

    最近流行起来的 Data URL,要在URL中使用二进制数据,当然也只能进行 ASCII 编码

当然除了 Base64 之外,还有其它一些编码方式可以将二进制数据编码成 ASCII 字符,比如十六进制编码,除此之外还有 Quoted-printable 等。甚至 URL 中使用 %XX 来对非 ASCII 字符进行编码的方式也可以算在内。

当然一般非特定环境下,选用十六进制编码和 Base64 编码的情况比较多,主要是因为这两种编码易用,而且转换后的数据量相对较小。

十六进制编码是将 1 个字节编码成 2 个十六进制字符,比如 0x10110110 编码成 B6,转换后数据量会增大 1 倍

Base64 编码是将 3 个字节共 24 位数据,以每 6 位一个 Base64 字符 [0-9a-zA-Z+/] 表示,24 位数据共需要 4 个 Base64 字符表示,编码后数据增长约 1/3。为什么是“约”?因为如果原数据字节数不是 3 的倍数,需要补位,这样转换出来的数据量就会比原来的 4/3 略多一点。

从上面的数据增长比来看,Base64编码 比十六进制编码更节省磁盘容量,所以一般较大的数据需要进行 ASCII 编码多采用 Base64;而较小的数据,则使用易于人工识别十六进制(用纸笔就能解码出来)。

  1. 传输信道只支持ASCII字符,不方便传输二进制流的场合。
  2. 含有非ASCII字符,容易出现编码问题的场合。
  3. 简易的掩人耳目。至少非开发人一眼看不出来是啥。

不讨论其他的,就讨论post中的图片使用base64编码的情况
186 down vote accepted

When you have some binary data that you want to ship across a network, you generally don't do it by just streaming the bits and bytes over the wire in a raw format. Why? because some media are made for streaming text. You never know -- some protocols may interpret your binary data as control characters (like a modem), or your binary data could be screwed up because the underlying protocol might think that you've entered a special character combination (like how FTP translates line endings).

So to get around this, people encode the binary data into characters. Base64 is one of these types of encodings. Why 64? Because you can generally rely on the same 64 characters being present in many character sets, and you can be reasonably confident that your data's going to end up on the other side of the wire uncorrupted.

1 肉眼安全
2 传输安全
3 效率OK

有的代码

是什么样的代码 能给个例子吗

现在自己用到base64是为了方便传输数据,可以把类序列化,通过base64进行传输

一般只是为了把二进制变成可打印字符才 base64 一下吧。要不无缘无故多了 1/3 的体积谁愿意啊。

我记得 百度地图的 sdk (iOS) ,以前sdk 里面没有将其他坐标转换到baidu 坐标的方法,但是他们有一个http接口,通过这个可以转换坐标,就是不知道为啥,他的结果一直是对x,y进行base64 编码的。最近的sdk终于里面内置了一个坐标转换函数了,但是无法理解的是,你把一个坐标传进去,出来的 NSDictionary 里面包含 x,y 居然还是 base64编码的,我一直很好奇这到底是为啥呢?

以前在看iOS代码中倒是看过这样的实现:将小图片等资源文件以Base64形式直接放于代码中。使用的时候反Base64后通过二进制转换成Image对象使用。使得Lib库更加精简。

在json里需要使用中文时一般都会用,小好多问题

推荐问题
宣传栏