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

Qa *_*sta 2 qr-code

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

版本: 40

纠错级别:L

数据位: 23.648

数字模式: 7089

字母数字模式: 4296

字节模式: 2953

我不知道这些点:

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

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

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

谢谢大家!

在此处输入图片说明

Ter*_*ton 5

您引用的数字的派生是在生成ISO/IEC 18004详细描述的符号时执行的几个不同步骤的结果。

任何用于数据容量的公式都必然是笨拙和无意义的,因为许多决定 QR 码符号结构的参数都是手动选择的,因此实现通常必须诉诸于包括这些非计算值的常量表。

如何导出可用数据位数

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

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

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

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

UsableDataBits = DataModules ? ErrorCorrectionBits

如何推导出每种模式的角色容量

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

  • 将 3 个字符的数字组分成 10 位;2个余数变成7位;1 余数变成 4 位。
  • 2 个字符的字母数字组为 11 位;1 余数变成 6 位。
  • Byte每个字符分成 8 位。
  • Kanji每个宽字符变成 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 二维码符号的字母数字容量。现在 4296 个字母数字字符正好变成 2148 组两个字符,每组转换为 11 位,产生 23628 个数据位,这正好在我们的符号容量之内。然而,4297 个字符将产生 2148 个组,其中一个余数字符将被编码为 6 位,总共产生 23628 + 6 位——超过了可用的 23631 位。因此,4296 个字符显然是 40-L 型二维码的正确字母数字容量。

同样,对于数字编码,我们有 23648?4?14 = 23630 位可用。您引用的 7089 正好是 2363 组三个字符,每组转换为 10 位,产生 23630 位 - 完全填充可用位。显然,任何其他字符都不适合,所以我们找到了我们的极限。

警告

虽然在实践中可以使用上述过程导出字符容量,但二维码允许在单个符号内使用多种模式对输入进行编码,并且一个合适的二维码生成器将根据需要在模式之间切换,以优化整体数据密度。这使得考虑容量限制的整个业务对于开放应用程序的用处要小得多,因为它们只描述了病理情况。

  • 你的解释非常清楚而且很有帮助。非常感谢@Terry Burton! (2认同)