我经常听到人们谈论“64进制编码”。它的用途是什么?
当前回答
从http://en.wikipedia.org/wiki/Base64
The term Base64 refers to a specific MIME content transfer encoding. It is also used as a generic term for any similar encoding scheme that encodes binary data by treating it numerically and translating it into a base 64 representation. The particular choice of base is due to the history of character set encoding: one can choose a set of 64 characters that is both part of the subset common to most encodings, and also printable. This combination leaves the data unlikely to be modified in transit through systems, such as email, which were traditionally not 8-bit clean. Base64 can be used in a variety of contexts: Evolution and Thunderbird use Base64 to obfuscate e-mail passwords[1] Base64 can be used to transmit and store text that might otherwise cause delimiter collision Base64 is often used as a quick but insecure shortcut to obscure secrets without incurring the overhead of cryptographic key management Spammers use Base64 to evade basic anti-spamming tools, which often do not decode Base64 and therefore cannot detect keywords in encoded messages. Base64 is used to encode character strings in LDIF files Base64 is sometimes used to embed binary data in an XML file, using a syntax similar to ...... e.g. Firefox's bookmarks.html. Base64 is also used when communicating with government Fiscal Signature printing devices (usually, over serial or parallel ports) to minimize the delay when transferring receipt characters for signing. Base64 is used to encode binary files such as images within scripts, to avoid depending on external files. Can be used to embed raw image data into a CSS property such as background-image.
其他回答
几年前,当邮件功能被引入时,它完全是基于文本的,随着时间的推移,对图像和媒体(音频、视频等)等附件的需求出现了。当这些附件通过互联网发送时(基本上是以二进制数据的形式),原始形式的二进制数据损坏的概率很高。因此,为了解决这个问题,BASE64出现了。
二进制数据的问题是它包含null字符,在一些语言中,如C, c++表示字符串的结束,因此以包含null字节的原始形式发送二进制数据将阻止文件被完全读取并导致损坏的数据。
例如:
在C和c++中,这个“null”字符表示字符串的结束。所以"HELLO"是这样存储的:
H e l l o
72 69 76 76 79 00
00表示“停在这里”。
现在让我们深入研究BASE64编码是如何工作的。
注意:字符串的长度应该是3的倍数。
例1:
要编码的字符串:" ace ",长度=3
将每个字符转换为十进制。
A = 97, c= 99, e= 101
将每个小数改为8位二进制表示。
97= 01100001, 99= 01100011, 101= 01100101
合并:01100001 01100011 01100101
在一组6位中分离。
011000 010110 001101 100101
从二进制到十进制计算
011000= 24, 010110= 22, 001101= 13, 100101= 37
使用base64 chart将十进制字符转换为base64。
24= Y, 22= W, 13= N, 37= l
“ace”=>“YWNl”
例2:
要编码的字符串:" abcd "长度=4,不是3的倍数。因此,要使字符串长度为3的倍数,我们必须添加2位填充使length= 6。填充位用“=”符号表示。
需要注意的是:一个填充位等于两个000,所以两个填充位等于四个0 0000。
所以让我们开始这个过程:-
将每个字符转换为十进制。
A = 97, b= 98, c= 99, d= 100
将每个小数改为8位二进制表示。
97= 01100001, 98= 01100010, 99= 01100011, 100= 01100100
在一组6位中分离。
011000, 010110, 001001, 100011, 011001, 00
所以最后6位是不完整的,所以我们插入两个填充位,等于4个零“0000”。
011000, 010110, 001001, 100011, 011001, 000000 ==
现在,它是相等的。末尾的两个等号表示添加了4个零(有助于解码)。
将二进制计算为十进制。
011000= 24, 010110= 22, 001001= 9, 100011= 35, 011001= 25, 000000=0 ==
使用base64 chart将十进制字符转换为base64。
24= Y, 22= W, 9= j, 35= j, 25= Z, 0= A ==
“abcd”=>“YWJjZA==”
一个十六进制数字是一个啃位(4位)。两个小字节构成8位,也称为1字节。
MD5生成128位输出,该输出使用32个十六进制数字序列表示,这些十六进制数字依次为32*4=128位。128位等于16字节(因为1字节等于8位)。
每个Base64字符编码6位(除了最后一个非填充字符可以编码2,4或6位);以及最后的填充字符(如果有的话)。因此,根据Base64编码,128位哈希至少需要⌈128/6⌉= 22个字符,如果有的话再加上pad。
使用base64,我们可以生成所需长度(6、8或10)的编码输出。 如果我们选择8字符长的输出,它只占用8个字节,而128位哈希输出则占用16个字节。
因此,除了安全性之外,还使用base64编码来减少空间消耗。
除了已经说过的,还有两种没有列出的非常常见的用法是
散列:
哈希是将一个字节块转换为另一个固定大小的字节块的单向函数,例如128bit或256bit (SHA/MD5)。将结果字节转换为Base64可以更容易地显示散列,特别是在比较完整性的校验和时。在Base64中经常看到哈希值,以至于许多人将Base64本身误认为是哈希值。
密码:
由于加密密钥不一定是文本,而是原始字节,因此有时需要将其存储在文件或数据库中,这在Base64中很方便。结果加密字节也是如此。
注意,尽管Base64经常用于密码学中,但它并不是一种安全机制。任何人都可以将Base64字符串转换回其原始字节,因此不应将其用作保护数据的手段,而应将其用作更容易显示或存储原始字节的格式。
证书
PEM格式的x509证书是base64编码的。http://how2ssl.com/articles/working_with_pem_files/
base64是一个二进制到文本的编码方案,以ASCII字符串格式表示二进制数据。Base64被设计用来跨通道传输二进制格式的数据。它接受任何形式的数据并将其转换为纯文本的长字符串。以前我们不能传输大量的数据,如文件,因为它是由2⁸比特字节组成的,但我们的实际网络使用2⁷比特字节。这就是base64编码出现的原因。但是base64到底是什么意思呢?
让我们来理解base64的含义。
base64 = base+64
我们可以调用base64作为基数64的表示。Base64仅使用6位(2 = 64个字符)来确保可打印的数据是人类可读的。但是,如何?我们也可以写base65或base78,但为什么只写64呢?让我们证明一下。 Base64编码包含64个字符来编码任何字符串。 base64包含:
10数值即,0,1,2,3,.....9。
26大写字母,即A,B,C,D,.......Z。
26个小写字母,即a,b,c,d,........z。
两个特殊字符,即+,/。取决于你的操作系统。
base64算法遵循的步骤如下:
count the number of characters in a String. If it is not multiple of 3 pad with special character i.e., = to make it multiple of 3. Encode the string in ASCII format. Now, it will convert the ASCII to binary format 8-bit each. After converting to binary format, it will divide binary data into chunks of 6-bits each. The chunks of 6-bit binary data will now be converted to decimal number format. Using the base64 Index Table, the decimals will be again converted to a string according to the table format. Finally, we will get the encoded version of our input string.
有些传输协议只允许传输字母数字字符。想象一下这样一种情况:控制字符用于触发特殊操作,或者每个字符只支持有限的位宽。Base64将任何输入转换为只使用字母数字字符、+、/和=作为填充字符的编码。
推荐文章
- 有人知道如何解码和编码Base64中的字符串使用Base64吗?
- 在UIImage和Base64字符串之间转换
- 如何检查一个字符串是否被Base64编码
- 如何保存一个PNG图像服务器端,从base64数据URI
- 如何存储自定义对象在NSUserDefaults
- 一个Unicode字符需要多少字节?
- 如何转换字符串和从UTF8字节数组在Java
- 如何确定文本的编码
- cmd.exe使用的编码/代码页是什么?
- 获取Windows中文件的编码
- 如何解码Python中的Base64数据?
- ArrayBuffer到base64编码的字符串
- 如何检查字符串是否为unicode或ascii?
- 在URL中传递base64编码的字符串
- 如何检测文本文件的编码/编码页?