目录

VLQ

VLQ (Variable-length quantity)是一种通用的,使用任意位数的二进制来表示一个任意大的数字的一种编码方式。

编码实现: ** 对数字137进行VLQ**编码,以下为分解步骤:

  1. 将137转成二进制形式 —— 10001001
  2. 七位一组做分组,不足的补前导0 —— 0000001 0001001
  3. 最后一组开头补0,其余补1(1表示连续位) —— 10000001 00001001.
  4. 最终137的VLQ编码形式为 —— 10000001 00001001
// 1. 将137转成二进制形式 —— 10001001
let binary = (137).toString(2);
// 2. 七位一组做分组,不足的补前导0 —— 0000001 0001001
let padded = binary.padStart(Math.ceil(binary.length / 7) * 7, '0');
// 3. 最后一组开头补0,其余补1(1表示连续位) —— 10000001 00001001
let groups = padded.match(/[01]{7}/g);
groups = groups.map((item, index) => (index == groups.length - 1 ? '0' : '1') + item);
let vlqCode = groups.join('');
// 4 最终137的VLQ编码形式为 —— 10000001 00001001
console.log(vlqCode);

Base64 VLQ

  • Base64 是一种可以把二进制数据编码成用 ASCII 表示的一种编码规则,Base64 VLQ 需要能够表示负数, 于是规定了需要先把数字变成无符号数, 用最后一位来作为符号标志位。
  • 一个Base64字符只能表示6bit(2^6)的数据,而第一位表示连续位,Base64 VLQ需要能够表示负数,因此最后一位用作符合标志位,真正表示数字的只有中间4位,因此一个单元表示的范围是[-15,15],如果超过了就要用连续位了
  • 在Base64 VLQ中,编码顺序是从低位到高位,而在VLQ中,编码顺序是从高位到低位
  • 常见用于项目中sourceMap编码

编码实现: ** 对数字137进行Base64 VLQ**编码,以下为分解步骤:

  1. 将137转成二进制形式 10001001,如果是负数需要转成绝对值 Math.abs
  2. 137是正数,末位符号位补0, 100010010 正数末位补0,负数末位补1
  3. 五位一组做分组,不足的补0, 01000 10010
  4. 将数组倒序排序 [ '10010', '01000' ] ,低位在前,高位在后
  5. 最后一组开头补0,其余补1(1表示连续位),110010 001000
  6. 转成base64,最终137的Base64 VLQ编码形式为 —— yI
let base64 = [
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
]; function encode(num) {
// 1. 将137转成二进制形式 10001001,如果是负数需要转成绝对值
let binary = (Math.abs(num)).toString(2);
// 2. 137是正数,末位符号位补0, 100010010 正数末位补0,负数末位补1
binary += num >= 0 ? '0' : '1';
// 3. 五位一组做分组,不足的补0, 01000 10010
binary = binary.padStart(Math.ceil(binary.length / 5) * 5, '0');
// 4. 将数组倒序排序 [ '10010', '01000' ] 低位在前,高位在后
let parts = binary.match(/\d{5}/g);
parts.reverse();
// 5. 最后一组开头补0,其余补1, 110010 001000 6个位bit
parts = parts.map((item, index) => (index == parts.length - 1 ? '0' : '1') + item);
// 6. 转成base64
let chars = [];
for (let i = 0; i < parts.length; i++) {
let base64Index = parseInt(parts[i], 2);
chars.push(base64[base64Index]);
}
return chars.join('');
}
let result = encode(137); // yI

在线编码解码的网站:http://murzwin.com/base64vlq.html

VLQ & Base64 VLQ 编码方式的原理及代码实现的更多相关文章

  1. Oracle EBS在编码方式为AL32UTF8时的注意事项

    现如今的EBS系统中,为了推进国际化的进程,以及系统向全球化的扩展,在Oracle数据库的编码方式上渐渐从支持中国本土简体中文的ZHS16GBK转向了更趋于国际化的AL32UTF8编码方式.但随之而来 ...

  2. Base64图片编码原理,base64图片工具介绍,图片在线转换Base64

    Base64图片编码原理,base64图片工具介绍,图片在线转换Base64 DataURI 允许在HTML文档中嵌入小文件,可以使用 img 标签或 CSS 嵌入转换后的 Base64 编码,减少  ...

  3. base64编码方式

    一.编码的两大方式: 在python3.x中,字符串编码分为unicode和bytes两大类编码方式. 直接书写s='中国人',这种方式定义的编码方式为unicode,是通用的方式. 另一种是byte ...

  4. base16,base32,base64 编码方式的通俗讲解

    作者:林冠宏 / 指尖下的幽灵 博客:http://www.cnblogs.com/linguanh/ GitHub : https://github.com/af913337456/ 腾讯云专栏: ...

  5. Base64的编码转换方式

    下面,详细介绍Base64的编码转换方式. 所谓Base64,就是说选出64个字符----小写字母a-z.大写字母A-Z.数字0-9.符号"+"."/"(再加上 ...

  6. iOS 中使用Base64编码方式编码图片数据

    最近一个项目要求对图片数据简单加密下,就是那种不能直接看到图片内容就行.于是我使用了base64编码对图片数据进行编码,把图片2进制数据变成了base64的字符串,再把这个字符串保存到server的数 ...

  7. 详细介绍Base64的编码转换方式

    下面,详细介绍Base64的编码转换方式. 所谓Base64,就是说选出64个字符----小写字母a-z.大写字母A-Z.数字0-9.符号"+"."/"(再加上 ...

  8. Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一

    Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045-RFC2049,上面有MIME的详细规范.Base64编码可用于在HTTP环境下传递较长的标识信息.例如 ...

  9. Java Base64加密、解密原理Java代码

    Java Base64加密.解密原理Java代码 转自:http://blog.csdn.net/songylwq/article/details/7578905 Base64是什么: Base64是 ...

随机推荐

  1. 20220716-Markdown语法学习

    目录 1.标题部分 2.目录 3.字体部分 4.引用 5.列表 6.代码块 7.表格 8.脚注 9.水平线 效果: 10.引用链接 11.URLs 12.图片 13.emoji 效果: 14.html ...

  2. linux常见命令(十)

    cut/grep/sort/uniq/wc 连续执行多个命令--;进入/data新建data01目录,在data01目录新建test.txtcd /data;mkdir data01;cd data0 ...

  3. 在centos服务器里安装opencv的坑:mportError: libXrender.so.1: cannot open shared object file: No such file or directory and wrong ELF class: ELFCLASS32

    centos7服务器安装opencv (其他版本服务器一样) 安装opencv: pip install opencv-python 导入cv2 import cv2 报错:importError: ...

  4. Unity获取脚本的CustomEditor(自定义编辑)数据

    在此之前,粗略的介绍下 CustomEditor(自定义编辑). Unity对于我们创建的Mono脚本提供了属性面板的展示和修改.默认情况下,Inspector面板中会显示当前脚本类的公开字段(pub ...

  5. {版本发布公告}HMS Core 6.6.0来啦

    分析服务 ◆ 留存分析支持¬将流失用户存为受众,开发者通过对流失人群的分层以及多维分析,在制定相关用户召回策略时将更有针对性: ◆ 原"受众分析"更名为"人群洞察&quo ...

  6. 【Java】idea同时运行多个一样的类

    点击"Edit Configurations..." 在左侧选中需要重复运行的类 单击"Modify options" 选择"Allow multip ...

  7. SpringMVC 02: SpringMVC响应get和post请求 + 5种获取前端数据的方式

    响应get和post请求 SpringMVC中使用@RequestMapping注解完成对get请求和post请求的响应 项目结构和配置文件与SpringMVC博客集中的"SpringMVC ...

  8. 最小生成树(prime+kruskal)

    1.prime算法 prime算法类似于bfs,就是判断每次连接的点中距离最短的,加入到树中,具体如下: prime算法要求一开始随便选择一个点作为起点,因为最小生成树包括所有点,所以起点随机即可(一 ...

  9. 大数据Hadoop平台安装及Linux操作系统环境配置

    配置 Linux 系统基础环境 查看服务器的IP地址 设置服务器的主机名称 hostnamectl set-hostname hadoop hostname可查看 绑定主机名与IP 地址 vim /e ...

  10. kingbaseES R3 集群修改data路径测试案例

    案例说明: 默认KingbaseES R3集群部署后,数据存储目录(data)在/home/kingbase下,部署时不能更改:本案例是在部署完成后,迁移data目录到其他指定的存储位置. 数据库版本 ...