问题标签 [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.
python - 给定一个整数,它的 varint 编码有多大?
我有一个 python 整数列表,我想知道当编码为 Protocol Buffers 可变长度整数或varints序列时它将占用多少空间。在不实际编码整数的情况下解决这个问题的最佳方法是什么?
php - 如何在 PHP 中解码 varints 的特定字节字符串
我正在尝试使用 PHP 以特定格式(炉石牌组代码)解码字符串,如下所示:
AAEBAc2xAgjAAe0E7QX3DdYRh6wC8fsCoIADC8kDqwTLBPsMhRDH0wKW6AK0/ALNiQPXiQOfmwMA
或者
AAEBAf0GBAD6DoyAA6CAAw37AZwCigbJB/gHlA+CEIUQrRDy0AL2/QKJgAPRgAMA
规格(原始描述)是:
数据字符串是一个 -encoded
base64字节字符串。除非另有说明,否则后面的每个值都是一个整数,编码为
unsigned varint.
标题块
- 保留字节 0x00
- 版本 (1)
- 格式
数据块
数据块被分成四对长度+数组,顺序如下:
- 英雄
- 单张卡
- 2张卡片
- n 副本卡
每对都有一个前导
varint指定数组中的项目数。对于前三个块,它们是varints. 对于最后一个块,它是成对的数组varints。这种结构的目标是使数据串尽可能紧凑。
我已经开始把一些东西放在一起,但是在处理原始字节时我是个新手。我的代码是:
我唯一确定的是base64_decode。我不知道unpack参数是否正确,或者vlq_decode函数是否按预期工作,因为我没有自己写。
在原始站点上有 Python 和 Javascript 的参考实现,但它们超出了我的想象,我无法使用这些代码来完成我的工作。
更新:
该代码确实产生了一个array看起来与我期望的相似的值,但许多值似乎并不正确。我认为从的转换varint仍然有些偏离。
Python 实现 ( Gist ) 生成不同的数字,格式略有不同,与包含 ID 数据的数据库(在dbfId字段中)很好地匹配
任何帮助表示赞赏!
已经有一个关于这个主题的问题,但它写得很糟糕,没有代码示例,所以我再试一次。
python - 负数导致 VarInt 的编码函数崩溃
我尝试在 Python 中实现下面的函数,但是一旦我输入负数,函数就会崩溃。有谁明白为什么?
这是我的功能:
int - varints 如何占用更少的空间?
我正在尝试了解 varints,而我发现的最好的东西是这个Google Protocol Buffers spec。
在他们的示例中,他们表明这个数字1010 1100 0000 0010在使用 varints 编码时300与44034.
通常数字 300 占用两个字节 ( 1 0010 1100),但他们的示例中的 300 也是如此。varints 如何实际上比普通 int 占用更少的字节?
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 作为长度编码字节(在本例中是三个后续字节)。
byte - VarInt 编码算法如何工作?
我一直在研究一个需要编码和解码无符号变量的库,但即使在阅读了编码的工作原理之后,我仍然无法理解它。
我将此代码用作参考:Varint encoding/decoding
我引用的函数是这样的:
我很困惑,尤其是这条线
当我最初使用这个例子时,我忘记了这一行的 AND 操作,但是涵盖了很多边缘情况的库代码从未中断过。在我的工作区中,它看起来像这样。
我最感兴趣的是“& 0x7F”有多重要?总体而言,此功能如何工作?
varint - 大端自定义变量的名称?
我正在寻找我使用的大端自定义 varint 的名称。(我几年前写的,但我怀疑它已经存在了。)
测试代码在解释编码方面可能比我做得更好:
编码的特点是:
- 大端
- 编码保留排序顺序
- 后续字节数是第一个字节中的前导数(无分支解码)
- 没有重复的编码,例如值 16384-16511,只需要两个字节而不是三个(比 Protocol Buffers 的 VarInt 的空间效率高 0.7%)
任何人都可以将其识别为预先存在的编码吗?
go - 如何在 Go 中编写 LEB128
你如何在 Go 中将整数写入 LEB128 格式?我正在尝试将 int32 编码为Minecraft VarInt,到目前为止,我已经尝试将 wiki 上的示例导入到 Go 中。我在测试时得到了错误的结果,wiki 说 -1 应该等于 [255 255 255 255 15],但我得到的是 [255 255 255 255 255]。我在这里做错了什么?
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 以获得合适的长度进行比较。