从输入数据计算最小二维码版本

时间:2021-01-11 12:46:26

标签: qr-code

我开始研究 ISO/IEC 18004 - “二维码规范”。

将数据编码为二维码(生成二维码)时,必须指定以下信息:

  • 模式(什么样的数据,例如numericalphanumericbinary、...)
  • 纠错级别(LMQH
  • 版本(二维码的“大小”)

我正在寻找一种数学(方程)方法来确定版本需要以指定的模式和纠错级别保存所提供的数据。该标准本身包含一个查找表,该表也可从各种网络资源获得,例如 thisthis(它们只是查找表)。

来自this very related SO answer的引用:

<块引用>

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

根据我目前对标准的理解,应该可以根据输入数据、模式和 ECC 级别确定所需的数据容量(以及最低版本)。答案甚至表达了最大容量的计算:

<块引用>

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

<块引用>

UsableDataBits = DataModules − ErrorCorrectionBits

我不明白导致求助于查找表的“尴尬”从何而来?根据我的理解,时序模式等的大小按版本固定。

有人可以进一步解释一下吗?

1 个答案:

答案 0 :(得分:1)

zxing 为此提供了一个实现:

https://github.com/zxing/zxing/blob/master/core/src/main/java/com/google/zxing/qrcode/encoder/Encoder.java

/**
* Decides the smallest version of QR code that will contain all of the 
provided data.
*
* @throws WriterException if the data cannot fit in any version
*/
private static Version recommendVersion(ErrorCorrectionLevel ecLevel,
                                        Mode mode,
                                        BitArray headerBits,
                                        BitArray dataBits)

Encoder 类提供了确定您正在寻找的最低版本的算法(“数学方法”)。

这个实现是否有任何“尴尬”,我无法回答。