首页 > 解决方案 > 使用固定块大小解码任意长度值?

问题描述

背景

过去,我编写了一个编码器/解码器,用于使用任意字母将整数转换为字符串或从字符串转换;即这个:

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块;我可能需要补零,但我不清楚在解码期间如何知道何时执行此操作,即当我不知道源值的基本长度时,只知道解码值的长度。

问题

如果我要走任意无符号整数宽度路线,我基本上会受图书馆作者的摆布,这可能很好;我想这些库将被相当优化以尽可能多地矢量化。

如果我尝试采用块路径,如果在编码期间输入长度不能被块大小整除,我可能会将块中的任何剩余位填充为零。但是,甚至可以在不知道解码值大小的情况下解码这样的值吗?

标签: encodingx86simddecodingbinary-data

解决方案


推荐阅读