问题标签 [varint]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1132 浏览

python - 给定一个整数,它的 varint 编码有多大?

我有一个 python 整数列表,我想知道当编码为 Protocol Buffers 可变长度整数或varints序列时它将占用多少空间。在不实际编码整数的情况下解决这个问题的最佳方法是什么?

0 投票
1 回答
808 浏览

php - 如何在 PHP 中解码 varints 的特定字节字符串

我正在尝试使用 PHP 以特定格式(炉石牌组代码)解码字符串,如下所示:

AAEBAc2xAgjAAe0E7QX3DdYRh6wC8fsCoIADC8kDqwTLBPsMhRDH0wKW6AK0/ALNiQPXiQOfmwMA

或者

AAEBAf0GBAD6DoyAA6CAAw37AZwCigbJB/gHlA+CEIUQrRDy0AL2/QKJgAPRgAMA

规格(原始描述)是:

数据字符串是一个 -encodedbase64字节字符串。

除非另有说明,否则后面的每个值都是一个整数,编码为unsigned varint.

  1. 标题块

    • 保留字节 0x00
    • 版本 (1)
    • 格式
  2. 数据块
    数据块被分成四对长度+数组,顺序如下:

    • 英雄
    • 单张卡
    • 2张卡片
    • n 副本卡

每对都有一个前导varint指定数组中的项目数。对于前三个块,它们是varints. 对于最后一个块,它是成对的数组varints。这种结构的目标是使数据串尽可能紧凑。

我已经开始把一些东西放在一起,但是在处理原始字节时我是个新手。我的代码是:

我唯一确定的是base64_decode。我不知道unpack参数是否正确,或者vlq_decode函数是否按预期工作,因为我没有自己写。

原始站点上有 Python 和 Javascript 的参考实现,但它们超出了我的想象,我无法使用这些代码来完成我的工作。

更新:

该代码确实产生了一个array看起来与我期望的相似的值,但许多值似乎并不正确。我认为从的转换varint仍然有些偏离。

Python 实现 ( Gist ) 生成不同的数字,格式略有不同,与包含 ID 数据的数据库(在dbfId字段中)很好地匹配

任何帮助表示赞赏!

已经有一个关于这个主题的问题,但它写得很糟糕,没有代码示例,所以我再试一次。

0 投票
1 回答
51 浏览

python - 负数导致 VarInt 的编码函数崩溃

我尝试在 Python 中实现下面的函数,但是一旦我输入负数,函数就会崩溃。有谁明白为什么?

这是我的功能:

0 投票
1 回答
53 浏览

int - varints 如何占用更少的空间?

我正在尝试了解 varints,而我发现的最好的东西是这个Google Protocol Buffers spec

在他们的示例中,他们表明这个数字1010 1100 0000 0010在使用 varints 编码时30044034.

通常数字 300 占用两个字节 ( 1 0010 1100),但他们的示例中的 300 也是如此。varints 如何实际上比普通 int 占用更少的字节?

0 投票
1 回答
646 浏览

rust - 计算前导/尾随 1/0 的效率有什么不同吗?

我正在设计一个带前缀的可变长度整数。

Rust 有计算前导和尾随 1 和 0 的方法:https ://doc.rust-lang.org/std/primitive.u64.html#method.leading_zeros

这些方法在 x86_64、arm32 和 arm64 上的效率有什么区别吗?

例如,如果计算尾随 1 比尾随 0 快,我将使用 xxxx0111 而不是 xxxx1000 作为长度编码字节(在本例中是三个后续字节)。

0 投票
0 回答
82 浏览

byte - VarInt 编码算法如何工作?

我一直在研究一个需要编码和解码无符号变量的库,但即使在阅读了编码的工作原理之后,我仍然无法理解它。

我将此代码用作参考:Varint encoding/decoding

我引用的函数是这样的:

我很困惑,尤其是这条线

当我最初使用这个例子时,我忘记了这一行的 AND 操作,但是涵盖了很多边缘情况的库代码从未中断过。在我的工作区中,它看起来像这样。

我最感兴趣的是“& 0x7F”有多重要?总体而言,此功能如何工作?

0 投票
0 回答
8 浏览

varint - 大端自定义变量的名称?

我正在寻找我使用的大端自定义 varint 的名称。(我几年前写的,但我怀疑它已经存在了。)

测试代码在解释编码方面可能比我做得更好:

编码的特点是:

  • 大端
  • 编码保留排序顺序
  • 后续字节数是第一个字节中的前导数(无分支解码)
  • 没有重复的编码,例如值 16384-16511,只需要两个字节而不是三个(比 Protocol Buffers 的 VarInt 的空间效率高 0.7%)

任何人都可以将其识别为预先存在的编码吗?

0 投票
1 回答
232 浏览

go - 如何在 Go 中编写 LEB128

你如何在 Go 中将整数写入 LEB128 格式?我正在尝试将 int32 编码为Minecraft VarInt,到目前为止,我已经尝试将 wiki 上的示例导入到 Go 中。我在测试时得到了错误的结果,wiki 说 -1 应该等于 [255 255 255 255 15],但我得到的是 [255 255 255 255 255]。我在这里做错了什么?

0 投票
2 回答
20 浏览

javascript - 从 javascript/Nodejs 中未知大小的字节流中解码前置 VarInt

我正在编写一个小型实用程序库,以在节点上的 js 中请求给定 minecraft 主机的服务器状态。我正在使用此处概述的服务器列表 Ping 协议 ( https://wiki.vg/Server_List_Ping ) 并使其大部分按预期工作,尽管在使用不受支持的数据类型 ( VarInt) 时遇到了很大的麻烦,并且不得不在互联网上搜索将 jsnums转换VarInts为以制作必要的数据包缓冲区的方法:

现在我可以通过发送握手数据包和查询数据包来请求服务器状态,并且确实接收到 JSON 响应,响应的长度作为 VarInt 前缀。

但是问题就在这里,我根本不知道如何VarInt从 JSON 响应的开头安全地识别 (因为它可以是最多 5 个字节)并将其解码回可读的num,这样我就可以获得正确的长度的响应字节流。

[...] 与所有字符串一样,它以 VarInt 的长度为前缀

(来自协议文档)

我当前的超级 hacky 解决方法是连接块,String直到连接的字符串包含相同的'{'s和计数'}'s(意味着一个完整的 json 对象),并'{'在解析它之前首先对 json 响应进行切片。

但是,我对这种解决问题的笨拙、低效、不雅且可能不可靠的方式非常不满意,我宁愿在 JSON 响应前解码 VarInt 以获得合适的长度进行比较。