当前位置:  开发笔记 > 编程语言 > 正文

base 64编码用于什么?

如何解决《base64编码用于什么?》经验,为你挑选了13个好方法。

我听说有人在这里和那里谈论"base 64编码".它是干什么用的?



1> Dave Markle..:

当您想要通过网络发送某些二进制数据时,通常不会通过以原始格式在线路上传输位和字节来实现.为什么?因为某些媒体是为流文本而制作的.你永远不会知道 - 有些协议可能会将你的二进制数据解释为控制字符(如调制解调器),或者你的二进制数据可能被搞砸了,因为底层协议可能认为你输入了一个特殊的字符组合(比如FTP如何转换行)结局).

因此,为了解决这个问题,人们将二进制数据编码为字符.Base64是这些类型的编码之一.

为什么64?
因为您通常可以依赖于许多字符集中存在的相同64个字符,并且您可以合理地确信您的数据最终会在线路的另一端不受损坏.


(理论上你可以做基数为80的编码或者类似的东西,但是它会更加困难.二者的权力是二进制的自然基础.)
@yokees:无法保证,他们只是*几乎总是*安全的角色.这就是为什么有多种形式的Base-64(http://en.wikipedia.org/wiki/Base-64).
这是否意味着所有网络类型的数据传递应该使用某种编码?
但是为什么base64方法用于编码字符串数据?例如在javascript atob函数中是否有意义服务器将json文件编码为base64格式?特殊字符可能是一个用例,但为什么不在这种情况下utf8,它们是否相同?任何进一步的资源将非常感谢谢谢.
如果有人知道的话,至少一些失败的协议列表会很好.
@Jon - 当我将Base64放入图像标签时浏览器使用哪种变体?

2> Jon Skeet..:

它基本上是一种用ASCII文本编码任意二进制数据的方法.每3字节数据需要4个字符,最后可能还有一些填充.

基本上每6位输入都用64个字符的字母表编码."标准"字母表使用AZ,az,0-9和+和/,=作为填充字符.有URL安全的变种.

维基百科是更多信息的合理来源.


@CholthiPaulTtiopic:加密或压缩或声音/图像/视频的结果.
@CholthiPaulTtiopic:我强烈反对用"字符串二进制"来思考.二进制数据应视为二进制数据,*不*视为文本.我已经看到了几百个 - 可能是数千个 - 关于SO的问题,这些问题基本上归结为人们对这种区别没有足够的关注.

3> Brad Wilson..:

Base-64编码是一种获取二进制数据并将其转换为文本的方式,以便在电子邮件和HTML表单数据等内容中更容易传输.

http://en.wikipedia.org/wiki/Base64



4> Ates Goral..:

它是二进制数据的文本编码,其中结果文本只有字母,数字和符号"+","/"和"=".这是通过专门用于文本数据的媒体存储/传输二进制数据的便捷方式.

但为什么Base-64?将二进制数据转换为文本的两种选择立即浮现在脑海中:

    十进制:将每个字节的十进制值存储为三个数字:045 112 101 037等,其中每个字节由3个字节表示.数据膨胀三倍.

    十六进制:将字节存储为十六进制对:AC 47 0D 1A等,其中每个字节由2个字节表示.数据膨胀了两倍.

Base-64映射3个字节(8 x 3 = 24位),4个字符,跨越6位(6 x 4 = 24位).结果看起来像"TWFuIGlzIGRpc3Rpb ...".因此,腹胀只是原来的4/3 = 1.3333333倍.


我是否理解正确,64是最佳选择,因为它是可转换为可打印ASCII字符的两个最高功率(其中有95个)?

5> Despertar..:

除了已经说过的内容之外,尚未列出的两个非常常见的用途是

哈希表:

散列是单向函数,可将字节块转换为固定大小的另一个字节块,如128位或256位(SHA/MD5).将结果字节转换为Base64使得显示哈希变得更加容易,尤其是在比较校验和的完整性时.在Base64中经常看到哈希,许多人将Base64本身误认为哈希.

密码:

由于加密密钥不必是文本而是原始字节,因此有时需要将其存储在文件或数据库中,Base64可以派上用场.与生成的加密字节相同.

请注意,虽然Base64经常用于加密,但它不是一种安全机制.任何人都可以将Base64字符串转换回原始字节,因此不应将其用作保护数据的方法,仅作为显示或存储原始字节的格式.

证书

PEM格式的x509证书是base 64编码的.http://how2ssl.com/articles/working_with_pem_files/


在很多情况下,将字节存储为字节实际上更容易处理.即使在数据库中,*尤其是*在文件中(如果使用固定长度的记录,或者字节是唯一的内容).Base64通常用于那些字节打算在某处传输*,特别是在可能丢失位或将某些字节解释为控制代码的通道上.

6> warren..:

来自http://en.wikipedia.org/wiki/Base64

术语Base64指的是特定的MIME内容传输编码.它还用作任何类似编码方案的通用术语,该编码方案通过以数字方式处理二进制数据并将其转换为基本64表示来对二进制数据进行编码.基本的特定选择是由于字符集编码的历史:可以选择一组64个字符,这两个字符既是大多数编码共有的子集的一部分,也是可打印的.这种组合使得数据不可能在通过诸如电子邮件的系统传输中被修改,这些系统传统上不是8位干净的.

Base64可以在各种环境中使用:

Evolution和Thunderbird使用Base64来混淆电子邮件密码[1]

Base64可用于传输和存储可能导致分隔符冲突的文本

Base64经常被用作快速但不安全的快捷方式来隐藏秘密,而不会产生加密密钥管理的开销

垃圾邮件发送者使用Base64来逃避基本的反垃圾邮件工具,这些工具通常不会解码Base64,因此无法检测编码邮件中的关键字.

Base64用于编码LDIF文件中的字符串

Base64有时用于将二进制数据嵌入XML文件中,使用类似于......的语法,例如Firefox的bookmarks.html.

在与政府财政签名打印设备(通常通过串行或并行端口)通信时也使用Base64,以最大限度地减少传输收据字符以进行签名时的延迟.

Base64用于编码脚本中的二进制文件(如图像),以避免依赖外部文件.

可用于将原始图像数据嵌入到CSS属性(如background-image)中.



7> James Curran..:

在计算机的早期,当电话线系统间通信不是特别可靠时,使用了一种快速而肮脏的验证数据完整性的方法:"比特奇偶校验".在这种方法中,发送的每个字节将具有7位数据,第8个将是1或0,以迫使字节中的1位总数为偶数.

因此0x01将被传输为0x81; 0x02将是0x82; 0x03将保持0x03等

为了进一步扩展该系统,在定义ASCII字符集时,仅为00-7F分配了字符.(今天仍然在80-FF范围内设置的所有字符都是非标准的)

当今的许多路由器将奇偶校验和字节转换放入硬件中,迫使连接到它们的计算机严格处理7位数据.此强制电子邮件附件(以及所有其他数据,这就是HTTP和SMTP协议基于文本的原因)将转换为纯文本格式.

很少有路由器能够存活到90年代.我严重怀疑它们今天是否正在使用中.


谢谢,这是一个很好的讨论点,也是一个有趣的历史课。

8> 小智..:

几年前,当引入邮件功能时,由于完全基于文本,随着时间的流逝,对图像和媒体(音频,视频等)附件的需求应运而生。当这些附件通过Internet发送时(基本上以二进制数据的形式),原始数据中二进制数据被破坏的可能性很高。因此,为解决此问题,BASE64出现了。

二进制数据的问题在于它包含空字符,在某些语言(如C,C ++)中,空字符表示字符串的结尾,因此以包含NULL字节的原始格式发送二进制数据将阻止文件被完全读取并导致损坏的数据。

例如 :

在C和C ++中,此“空”字符显示字符串的结尾。因此,“ HELLO”的存储方式如下:

你好

72 69 76 76 79 00

00表示“在这里停止”。

现在让我们深入研究BASE64编码的工作原理。

注意点:字符串的长度应为3的倍数。

范例1:

要编码的字符串:“ ace”,长度= 3

1)将每个字符转换为十进制。

a = 97,c = 99,e = 101

2)将每个十进制更改为8位二进制表示。

97 = 01100001,99 = 01100011,101 = 01100101

合并:01100001 01100011 01100101

3)分成一组6位。

011000 010110 001101 100101

4)计算二进制到十进制

011000 = 24,010110 = 22,001101 = 13,100101 = 37

5)使用base64图表将十进制字符转换为base64。

24 = Y,22 = W,13 = N,37 = l

“ ace” =>“ YWNl”

范例2:

要编码的字符串:“ abcd” Length = 4,不是3的倍数。因此,要使字符串的长度是3的倍数,我们必须添加2位填充以使length =6。填充位由“ =”符号表示。

需要注意的一点:一个填充位等于两个零00,所以两个填充位等于四个零0000。

因此,让我们开始这个过程:

1)将每个字符转换为十进制。

a = 97,b = 98,c = 99,d = 100

2)将每个十进制更改为8位二进制表示。

97 = 01100001,98 = 01100010,99 = 01100011,100 = 01100100

3)分成一组6位。

011000、010110、001001、100011、011001、00

因此最后6位未完成,因此我们插入了两个填充位,它们等于四个零“ 0000”。

011000、010110、001001、100011、011001、000000 ==

现在,它是相等的。最后的两个等号表示添加了4个零(有助于解码)。

4)计算二进制到十进制。

011000 = 24,010110 = 22,001001 = 9,100011 = 35,011001 = 25,000000 = 0 ==

5)使用base64图表将十进制字符转换为base64。

24 = Y,22 = W,9 = j,35 = j,25 = Z,0 = A ==

“ abcd” =>“ YWJjZA ==”



9> Konrad Rudol..:

某些传输协议仅允许传输字母数字字符.想象一下控制字符用于触发特殊操作和/或仅支持每个字符的有限位宽的情况.Base64将任何输入转换为仅使用字母数字字符的编码+,/以及=作为填充字符.



10> Basil Musa..:

我将在这里描述的Base64的用法有点像黑客.所以,如果你不喜欢黑客,请不要继续.

当我发现MySQL的utf8不支持4字节unicode字符时,我遇到了麻烦,因为它使用的是3字节版本的utf8.那么我做了什么来支持MySQL的utf8完整的4字节unicode?好吧,base64在存储到数据库时编码字符串,在检索时编码base64解码.

由于base64编码和解码非常快,上面的工作非常完美.

您需要注意以下几点:

Base64编码使用了33%的存储空间

存储在数据库中的字符串不会是人类可读的(您可以将其作为数据库字符串使用基本加密形式的功能出售).

您可以将上述方法用于任何不支持unicode的存储引擎.


"你可以将其作为数据库字符串使用基本加密形式的功能出售"我喜欢你的风格:D
"你可以将其作为数据库字符串使用基本加密形式的功能出售"这是一个可怕的事情:D

11> Can Berk Güd..:

它用于将任意二进制数据转换为ASCII文本.

例如,电子邮件附件以这种方式发送.



12> Andrew Cox..:

当我们通过Web服务传输大型二进制对象(图像)时,我在实际意义上使用它.因此,当我使用python脚本测试C#Web服务时,可以使用一点魔法重新创建二进制对象.

[在python中]

import base64
imageAsBytes = base64.b64decode( dataFromWS )



13> 小智..:

“ Base64编码方案通常用于需要对二进制数据进行编码的情况,而二进制数据需要通过旨在处理文本数据的媒体进行存储和传输。这是为了确保数据在传输过程中保持完整而无需修改”(Wiki,2017年)

示例如下:您有一个仅接受ASCII字符的Web服务。您想要保存然后将用户数据传输到其他位置(API),但是收件人希望接收未更改的数据。为此,使用Base64。。。唯一的缺点是,base64编码将比常规字符串多占用33%的空间。

另一个示例:uenc =编码的url = aHR0cDovL2xvYy5tYWdlbnRvLmNvbS9hc2ljcy1tZW4tcy1nZWwta2F5YW5vLXhpaS5odG1s = http://loc.querytip.com/asics-men-s-gel-ka。

如您所见,如果要发送上次访问的URL作为参数,则不能在URL中放置字符“ /”,因为我们会破坏“ MOD重写”的GET参数的属性/值规则。

完整的示例为:“ http://loc.querytip.com/checkout/cart/add/uenc/http://loc.magento.com/asics-men-s-gel-kayano-xii.html/product / 93 / ”

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有