我经常听到人们谈论“64进制编码”。它的用途是什么?
当前回答
在计算机的早期,当电话线系统间的通信不是特别可靠时,一种快速而肮脏的验证数据完整性的方法被使用:“位奇偶校验”。在这种方法中,传输的每个字节都有7位数据,第8位将是1或0,以强制字节中1位的总数为偶数。
因此,0x01将作为0x81传输;0x02将是0x82;0x03仍然是0x03等等。
为了进一步完善这个系统,当定义ASCII字符集时,只有00-7F被分配字符。(直到今天,所有设置在80-FF范围内的字符都是非标准的)
当时的许多路由器都把奇偶校验和字节转换放在硬件中,迫使连接到它们的计算机严格处理7位数据。这迫使电子邮件附件(以及所有其他数据,这就是为什么HTTP和SMTP协议是基于文本的)转换为纯文本格式。
这些路由器很少能活到90年代。我非常怀疑它们中任何一个现在还在使用。
其他回答
当需要对二进制数据进行编码时,通常使用Base64编码方案,这些数据需要通过设计用于处理文本数据的媒体存储和传输。这是为了确保数据在传输过程中保持完整而不被修改”(Wiki, 2017)
示例可能如下:您有一个只接受ASCII字符的web服务。你想要保存用户的数据,然后将其传输到其他位置(API),但接收者想要接收未触及的数据。Base64是用来…唯一的缺点是base64编码需要比常规字符串多33%的空间。
另一个示例::uenc = url encoded = aHR0cDovL2xvYy5tYWdlbnRvLmNvbS9hc2ljcy1tZW4tcy1nZWwta2F5YW5vLXhpaS5odG1s = http://loc.querytip.com/asics-men-s-gel-kayano-xii.html。
正如你所看到的,如果我们想把最后一次访问的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/ "
Base-64编码是一种获取二进制数据并将其转换为文本的方法,这样就更容易在电子邮件和HTML表单数据中传输。
http://en.wikipedia.org/wiki/Base64
大多数情况下,我看到它被用于在只能处理ascii或简单字符集的上下文中对二进制数据进行编码。
几年前,当邮件功能被引入时,它完全是基于文本的,随着时间的推移,对图像和媒体(音频、视频等)等附件的需求出现了。当这些附件通过互联网发送时(基本上是以二进制数据的形式),原始形式的二进制数据损坏的概率很高。因此,为了解决这个问题,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==”
我要在这里描述的Base64的用法有点hack。所以如果你不喜欢黑客,请不要继续。
当我发现MySQL的utf8不支持4字节unicode字符时,我遇到了麻烦,因为它使用了3字节版本的utf8。那么我做了什么来支持完整的4字节unicode MySQL的utf8?base64在存储到数据库时编码字符串,在检索时解码字符串。
由于base64编码和解码非常快,上面的工作非常完美。
你需要注意以下几点:
Base64编码多使用33%的存储空间 存储在数据库中的字符串不是人类可读的(您可以将其作为数据库字符串使用基本加密形式的特性出售)。
对于任何不支持unicode的存储引擎,都可以使用上述方法。
推荐文章
- 如何在iOS上进行base64编码?
- URL方案/主机/路径中的“+”是否代表空格?
- HTML编码问题-显示“”字符而不是“ ”
- 在HTML中,我可以用✓做一个复选标记;. 有相应的x标记吗?
- 有人知道如何解码和编码Base64中的字符串使用Base64吗?
- 在UIImage和Base64字符串之间转换
- 如何检查一个字符串是否被Base64编码
- 如何保存一个PNG图像服务器端,从base64数据URI
- 如何存储自定义对象在NSUserDefaults
- 一个Unicode字符需要多少字节?
- 如何转换字符串和从UTF8字节数组在Java
- 如何确定文本的编码
- cmd.exe使用的编码/代码页是什么?
- 获取Windows中文件的编码
- 如何解码Python中的Base64数据?