base-122编码,比base-64更加高效

这是一种比base-64更加节省空间的编码方式。github地址

1.概述

在网络编程中,我们常需要利用一些文本传输协议(如POP3SMTP)协议来传输二进制数据。

这时候必须要先将它们转化为文本格式才能进行传输,最常用的编码方式就是base-64。它虽然简单方便,容易实现,但是将会带来33%的数据量增长。

2.一个小例子

有些时候我们想把图片、字体、音频等二进制文件作为url的一部分传输给客户端/服务器,这样可以减少一次请求和响应。当然,我们必须保证这些文件不能太大。

比如,原来是这样写的:


<img src="example.png" />

为了避免这次额外的资源请求,我们可以利用base-64编码从而换成下面的写法:

<img src="https://img-blog.csdnimg.cn/2022010614283130871.png" />

虽然这种做法可能对于小文件来说确实可以优化整个数据传输的效率,但是如果不慎用于大文件将很可能导致性能的下降。原因就是base-64编码会导致额外增加33%的传输量。下面讲简要分析其原因。

3.base-64编码

base-64是将二进制数据转换为文本数据的最常用方法,比如说要把一个字节的二进制数据–01101001插入到一个文本文件中。最直接的方法就是找两个字符分别与01对应,如果我们选择的是AB,那么转换的结果就是下面这样的(假设这是一个只有1个像素的图片文件)。


<img src="data:image/png;sillyEncoding,ABBABAAB" />

虽然实现起来很简单,但是编码后的数据会变为原来的八倍。

对于base-64,他会把数据按照每6个位分为一组(一共有64种组合方式),每种组合方式(编号为063)各对应一个字符,然后进行编码。这样转换前后的数据量之比就为8:6

如果原数据的数据量(以位为单位计算)不是6的倍数,添加1个2个额外的字节来凑足24位,然后分成3组后再对应编码。但是这1个2个额外添加的字节不参与编码,而是最后统一转换成1个或2个=号。

那么,如果使用base-64来编码上面的图片文件,结果将变成:


<img src="https://img-blog.csdnimg.cn/2022010614283134183.png" />

base-64编码使用的字符包括26个大写字母+26个小写字母+10个阿拉伯数字,最后还有两个特殊符号+/

为了改良base-64,我们可以考虑使用其他的编码字符,但是ASCII的限制太多,很难再找到更加高效并且简单可行的映射关系,所以我们下面尝试在UTF-8中寻找解决方案。

4.UTF-8编码

因为大部分的网页文件(尤其是有汉字的)其实是由UTF-8编码而成的,所以我们的想法是完全可行的。

下面我们开始介绍关于UTF-8的一些核心概念。

UTF-8是一种对于Unicode的可变长字符编码方式,一共支持1,112,064个符号点。所谓符号点,其实就是可以表示为一个字符的数字(在Unicode中,并不是所有的数字都可以转换表示成一个字符)。对于ASCII字符的编码,可以只用一个字节;但是对于某些的符号点,就可能需要使用多达4个字节来表示这个字符。

Unicode中符号点的范围UTF-8编码所用的总位数符号点所占的位数增加率
0x00 – 0x7F0xxxxxxx878:7
0x80 – 0x7FF110xxxxx 10xxxxxx161116:11
0x800 – 0xFFFF1110xxxx 10xxxxxx 10xxxxxx241624:16
0x10000 – 0x10FFFF11110xxx 10xxxxxx 10xxxxxx 10xxxxxx322132:21

上面的增加率,就是表示该范围内的符号数所用的位数和实际上真正有效的位数(其他的位只是作为辅助标识)。

如果使用上表中的单字节编码方式来将我们的二进制数据转换成UTF-8编码,那么结果将会是下面这样子的:

每7位为一组

如果使用这种每7位1组的编码方式,那么编码之后得到的数据量将从base648:6下降为8:7

但是很遗憾,如果在网页中使用这种编码方式,将会引起冲突,不然base64也不会从ASCII编码字符只中选取其中的64个作为目标字符,原因还是为了避免在网页解析时发生冲突。

比如,我们转换后的数据一般是以下面这种形式出现在网页代码中的:

<img src="data:image/png;ourEncoding,(Encoded data)" />

(如果数据中出现",这个字符就可能使浏览器误以为是字符串的结束,进而造成数据截断)。

5.如何避免冲突

为了保证编码后得到的字符不会在HTML页面中引起冲突,我们需要找出所有的“不安全”的字符。(比如双引号"

除了双引号"以外,还有换行字符\n、回车字符\r、转义字符\&、不可显示的null字符0x00都会引起解析冲突。

这样,把上面的6个”不安全“字符剔除后,只剩下122个字符。

6.base-122编码

这样我们的方案基本成型了,将原二进制数据按照每7位为一组(如果数据长度不是7的倍数,则需要填充),然后直接转换为UTF-8中的单字节字符,0xxxxxxx

如果转换后的字符不凑巧就是6个“不安全”的字符之一,则做进一步的转换,将其变成双字节的UTF-8字符:110xxxxx 10xxxxxx。因为只有6个字符,其实只需要3个位就行了,这里我们使用sss来表示这些实际有效的数据位,110sssxx 10xxxxxx

那么剩下来还有8个位可以存放数据,这8个位完全足够存放下一组的7个位的数据。这样我们选后面的7位来存放下一组的数据即可,110sss1x 10xxxxxxsss用来标识不安全的6个字符,xxxxxxx用来存放下一组的数据)。

base-122编码的最终效果如下:
base-122

终于,我们完成了编码前后数据比为7:8的目标,编码同样的数据,所占用的数据量是base-6486%

7.如何使用

使用前必须保证你的HTML文件使用的是UTF-8编码格式。

<head><meta charset="utf-8"></head>

用法见github首页的介绍。

https://github.com/kevinAlbs/Base122

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 新的10BASE-T1L标准相较于之前的标准,主要有以下变化:采用单线通信,传输速率为10Mbps,支持最长100米的链路长度,使用PAM3调制技术,支持全双工通信,同时还增加了对电磁兼容性和抗干扰性的要求。 ### 回答2: 10BASE-T1L是一种新的以太网标准,与传统的以太网标准相比,它具有以下几个变化。 首先,10BASE-T1L标准的传输速率更高。传统的以太网标准通常以百兆位速率进行数据传输,而10BASE-T1L标准将传输速率提升到了1千兆位。这一变化使得数据传输更加快速高效,能够满足日益增长的数据传输需求。 其次,10BASE-T1L标准引入了新的线缆类型。传统以太网标准使用的是双绞线,而10BASE-T1L标准则使用更高质量的线缆,如CAT6A或CAT7,以支持更高的传输速率和更长的传输距离。 再次,10BASE-T1L标准引入了全双工通信模式。传统的以太网标准使用半双工通信模式,即同一时间只能进行数据的发送或接收,而不能同时进行。而10BASE-T1L标准则支持全双工通信,可以同时进行数据发送和接收,提高了网络的利用率和传输效率。 另外,10BASE-T1L标准还改善了网络的可靠性和可扩展性。它引入了更高的误码率容忍度,可以更好地应对线缆质量不佳或其他干扰因素。同时,10BASE-T1L标准还支持更长的链路长度,使得网络的覆盖范围更广,更容易进行扩展和升级。 总的来说,10BASE-T1L标准在传输速率、线缆类型、通信模式、可靠性和可扩展性等方面都进行了改进和优化,使得以太网网络更加适应当前和未来的高速数据传输需求。 ### 回答3: 10BASE-T1L是一个新的以太网标准,它带来了一些变化和改进。首先,新标准采用了全双工的通信方式,使得数据的传输更加高效和可靠。传统的10BASE-T标准采用的是半双工通信,即同一时间内只能进行发送或接收操作,而新的10BASE-T1L标准可以同时进行发送和接收数据。 其次,10BASE-T1L标准在物理层的链路速率上进行了提升。传统的10BASE-T标准的链路速率为10 Mbps,而新的10BASE-T1L标准将链路速率提升到了100 Mbps,使得数据的传输速度更快,网络的响应更迅速。 此外,新的10BASE-T1L标准还引入了更高的抗干扰能力。新标准采用了更复杂的编码和调制技术,使得信号在传输过程中更稳定、更不容易受到干扰。这种抗干扰的能力可以提高网络的可靠性,并减少数据传输错误的发生。 最后,10BASE-T1L标准能够支持更长的数据传输距离。传统的10BASE-T标准的传输距离为100米,而新的10BASE-T1L标准将传输距离扩展到了1000米。这样一来,网络的覆盖范围更广,可以满足更多应用场景的需求。 总的来说,新的10BASE-T1L标准相比传统的10BASE-T标准在通信方式、链路速率、抗干扰能力和传输距离等方面都有了一系列的提升和改进,为以太网的发展带来了更加先进和高效的解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值