encoding - 使用固定块大小解码任意长度值?
问题描述
背景
过去,我编写了一个编码器/解码器,用于使用任意字母将整数转换为字符串或从字符串转换;即这个:
abcdefghjkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789
相似字符被排除在外,因此1
, I
, l
, O
, 和0
不在此字母表中。这样做是为了方便用户并使其更易于阅读和输入值。
如上所述,我之前的项目python-ipminify
使用与上述类似的字母表将 32 位 IPv4 地址转换为字符串,但不包括大写字符。在我目前的工作中,我没有排除大写字符的限制。
我使用这里关于如何构建 URL-shortener的优秀问答为这个项目编写了我自己的 Python 。
我在这里发布了一个独立的逻辑示例作为 Gist。
问题
我现在正在用一种编译语言编写一个性能关键的实现,很可能是 Rust,但我也需要将它移植到其他语言。我还必须接受任意长度的字节数组,而不是像 Python 中那样的任意宽度的整数。
我想只要我使用无符号整数并使用一致的字节序,我就可以将字节数组视为一个长的任意精度无符号整数并对其进行除法,尽管我不确定性能将如何扩展。我希望任意精度的无符号整数库在可能的情况下尝试使用向量指令,但我不确定当输入长度与特定指令长度不匹配时这将如何工作,即当输入大小以位为单位时不能被支持的指令整除,例如 8、16、32、64、128、256、512 位。
我还考虑将字节数组分解为 256 位(32 字节)块并使用 SIMD 指令(我只需要在最近的 CPU 上支持 x86_64)直接对更大的无符号整数进行操作,但我不完全确定如何处理size % 32 != 0
块;我可能需要补零,但我不清楚在解码期间如何知道何时执行此操作,即当我不知道源值的基本长度时,只知道解码值的长度。
问题
如果我要走任意无符号整数宽度路线,我基本上会受图书馆作者的摆布,这可能很好;我想这些库将被相当优化以尽可能多地矢量化。
如果我尝试采用块路径,如果在编码期间输入长度不能被块大小整除,我可能会将块中的任何剩余位填充为零。但是,甚至可以在不知道解码值大小的情况下解码这样的值吗?
解决方案
推荐阅读
- java - PDFBox - 签名后定义可视签名模板
- automation - 通过命令行触发赛普拉斯测试时,Firefox 浏览器不会关闭
- javascript - 可以从另一个模块访问模块内存空间吗?
- f# - 带有数字后缀的泛型类型参数的 F# 类型推断?
- python - EMNIST 数据集中的类问题
- r - R Shiny --> 基于虚拟变量的 SelectInput 创建箱线图
- postgresql - SQL查询到查询集(django)转换器
- python-3.x - Discord.PY 帮助命令
- c# - 带有聚合管道的 MongoDB C# 驱动程序更新文档
- javascript - 为什么编译器找不到'axios'