2个不稳定版本
0.2.0 | 2023年4月13日 |
---|---|
0.1.0 | 2023年4月10日 |
#1309 在 编码
163 每月下载量
63KB
1.5K SLoC
code128
此crate实现了ISO/IEC 15417:2007定义的Code 128条形码的编码和解码。
为了实现最小的编码大小,使用动态规划方法。可以编码完整的256位范围。为了最佳兼容性,建议保持在可打印ASCII范围内。
按重要性顺序,实现目标包括
- 正确性,
- 最优大小,
- 性能,
- 和“自然”编码选择。
实现
首先实现的是使用动态规划的编码器。由于Code 128在编码过程中可以切换三个字符集,基本思想是逐个字符集计算最佳可能的编码,该编码以该字符集结束。细节有点复杂,但结果将是最佳编码。
使用惊人的cargo fuzz和LibFuzzer项目对基于动态规划的编码器进行了模糊测试。在模糊测试过程中,将输入编码和解码,然后检查以给我们返回输入。这发现了几个错误。
为了进一步验证,实现了ISO/IEC 15417中指定的编码器。简而言之,该编码器根据剩余数据决定应该选择哪个字符集。这些规则在编码来自高字节范围(0x80
到0xFF
)的输入时会导致良好但不是最优的编码大小。规则得到了改进,但这也使得它们更难以检查、理解和更慢。再次使用模糊测试将基于规则的编码器与动态规划编码器进行比较,这又发现了两个编码器中的错误并导致了大量测试用例。
为了避免实现过于复杂,当前的编码器现在使用基于规则的编码器,直到看到来自高字节范围的输入,此时我们切换到动态规划编码器。对于来自0x00
到0x7F
的输入,这将给我们基于规则的编码器的小内存占用和良好性能。
依赖项
~110KB