2个不稳定版本

0.2.0 2023年4月13日
0.1.0 2023年4月10日

#1309编码

Download history 4/week @ 2024-04-12 19/week @ 2024-04-19 5/week @ 2024-04-26 1/week @ 2024-05-03 2/week @ 2024-05-10 8/week @ 2024-05-17 22/week @ 2024-05-24 7/week @ 2024-05-31 11/week @ 2024-06-07 4/week @ 2024-06-14 11/week @ 2024-06-21 10/week @ 2024-06-28 2/week @ 2024-07-05 19/week @ 2024-07-12 89/week @ 2024-07-19 52/week @ 2024-07-26

163 每月下载量

Apache-2.0 OR MIT

63KB
1.5K SLoC

code128

crates.io Documentation License

此crate实现了ISO/IEC 15417:2007定义的Code 128条形码的编码和解码。

Code 128 encoding 'This is a Code 128'

为了实现最小的编码大小,使用动态规划方法。可以编码完整的256位范围。为了最佳兼容性,建议保持在可打印ASCII范围内。

按重要性顺序,实现目标包括

  • 正确性,
  • 最优大小,
  • 性能,
  • 和“自然”编码选择。

实现

首先实现的是使用动态规划的编码器。由于Code 128在编码过程中可以切换三个字符集,基本思想是逐个字符集计算最佳可能的编码,该编码以该字符集结束。细节有点复杂,但结果将是最佳编码。

使用惊人的cargo fuzzLibFuzzer项目对基于动态规划的编码器进行了模糊测试。在模糊测试过程中,将输入编码和解码,然后检查以给我们返回输入。这发现了几个错误。

为了进一步验证,实现了ISO/IEC 15417中指定的编码器。简而言之,该编码器根据剩余数据决定应该选择哪个字符集。这些规则在编码来自高字节范围(0x800xFF)的输入时会导致良好但不是最优的编码大小。规则得到了改进,但这也使得它们更难以检查、理解和更慢。再次使用模糊测试将基于规则的编码器与动态规划编码器进行比较,这又发现了两个编码器中的错误并导致了大量测试用例。

为了避免实现过于复杂,当前的编码器现在使用基于规则的编码器,直到看到来自高字节范围的输入,此时我们切换到动态规划编码器。对于来自0x000x7F的输入,这将给我们基于规则的编码器的小内存占用和良好性能。

依赖项

~110KB