如何计算每个二维码的最大数据位?

How to calculate the maximum of data bits for each QR code?

有一些关于 QR 版本 40(177*177 模块) 的信息,修正级别为 L(7% 错误修正)

Version: 40

Error Correction Level: L

Data bits: 23.648

Numeric Mode: 7089

Alphanumeric Mode: 4296

Byte Mode: 2953

我不知道这几点:

  1. 1个模块等于1位吗?

  2. 如何计算二维码类型的最大数据位数?例如,为什么我们有 23,648 个数据位?

  3. 二维码类型的数据位如何转换为Numeric/Alphanumeric?例如为什么我们有 7,089 个数字和 4,296 个字母数字?

谢谢大家!

您所指的数字的推导是在生成 ISO/IEC 18004 中详细描述的符号时执行的几个不同步骤的结果。

任何关于数据容量的公式都必然是笨拙和没有启发性的,因为许多决定 QR 码符号结构的参数都是手动选择的,因此实现通常必须求助于包括这些非计算的常量表值。

如何推导出可用数据位数

本质上,所选符号版本的数据模块总数将是总符号区域减去任何功能模式模块和 format/version 信息模块:

DataModules = Rows × Columns − ( FinderModules + AlignmentModules + TimingPatternModules ) − ( FormatInformationModules + VersionInformationModules )

这些参数的值是每个符号版本定义的常量。

然后将这些数据模块中的一些分配给由所选纠错级别定义的纠错目的。剩下的就是通过将每个剩余模块视为单个位找到的符号的可用数据容量:

UsableDataBits = DataModules − ErrorCorrectionBits

如何推导出每个模式的字符容量

输入数据的编码以 4 位模式指示符开始,后跟字符计数值,其长度取决于符号的版本和模式。然后根据特定模式的规则对数据进行编码,从而产生以下数据压缩:

  • 数字 3个字符为10位; 2个余数变成7位; 1 余数变成 4 位。
  • 字母数字 将 2 个字符分成 11 位; 1 余数分成 6 位。
  • 字节每个字符分成8位。
  • 汉字每个宽字分成13位

虽然它不影响符号容量,但为了完整起见,我会指出附加了一个 4 位终止符模式,如果符号容量不足,它可能会被截断或省略。然后用填充模式填充任何剩余的数据位。

实例

给定一个纠错级别为 L 的版本 40 符号。

大小为177×177 = 31329个模块

有3个8×8定位模式(192个模块),46个5×5对齐模式(1150个模块)和272个定时模块,共计1614个功能模式模块。

还有31个格式信息模块和36个版本信息模块,共计67个模块。

DataModules = 31329 − 1614 − 67 = 29648

纠错级别 L 规定应有 750 个 8 位纠错码字(6000 位):

UsableDataBits = 29648 − 6000 = 23648

版本 40 符号的字符计数长度指定如下:

  • 数值 14 位。
  • 字母数字 13 位。
  • 字节 16位。
  • 汉字 12位。

考虑字母数字编码。从派生的 UsableDataBits 可用的 23648 位数字中,我们为模式指示符取 4 位,为字符计数取 13 位,只剩下 23631 用于实际的字母数字数据(和可截断的终止符)和填充。)

您引用 4296 作为版本 40-L QR 码符号的字母数字容量。现在 4296 个字母数字字符正好变成 2148 组两个字符,每组转换为 11 位,产生 23628 个数据位,正好在我们的符号容量内。然而,4297 个字符将产生 2148 个组,其中一个余数字符将被编码为 6 位,总共产生 23628 + 6 位——超过了可用的 23631 位。所以4296个字符显然是40-L QR Code的正确字母数字容量。

与数字编码类似,我们有 23648−4−14 = 23630 位可用。您引用的 7089 恰好是 2363 组三个字符,每组转换为 10 位,产生 23630 位——正好填充可用位。显然,任何其他字符都不适合,所以我们找到了我们的限制。

警告

虽然实际上可以使用上述过程导出字符容量,但 QR 码允许在单个符号内使用多种模式对输入进行编码,并且像样的 QR 码生成器会根据需要经常在模式之间切换以优化整体数据密度。这使得考虑容量限制的整个业务对于开放应用程序来说用处不大,因为它们仅描述了病态情况。