有效输入二维码生成失败

QR code generation failure for valid input

我正在尝试使用 qrcode 包生成自定义 QR 码,但我 运行 遇到了一个问题,它似乎在有效输入时失败。我想知道这是程序包中的错误还是我不熟悉的二维码的预期行为。

根据 this site,具有中等纠错功能的版本 1 QR 码最多可包含 20 个字母数字值。 myStr 下面是一个简单的字母数字字符串,长度为 19 个字符,它失败并输出

qrcode.exceptions.DataOverflowError: Code length overflow. Data size (131) > size available (128)

但是,如果我将 myStr0000000000A0000A000 更改为 000000000000000A000,该字符串仍然是字母数字且长度相同,但随后它通过了。

import qrcode
qr = qrcode.QRCode(
    version=1,
    error_correction=qrcode.constants.ERROR_CORRECT_M,
)

myStr = '0000000000A0000A000'
print(len(myStr))
qr.add_data(myStr)
qr.make(fit=False)
img = qr.make_image()

Windows,Python2.7,二维码5.3版本,Pillow

错误

qrcode.exceptions.DataOverflowError: Code length overflow. Data size (131) > size available (128)

指向的是二维码创建的buff,不是你的。 在 qrcode/util.py:

print 'len(buffer):', len(buffer)
print 'buffer:', buffer
if len(buffer) > bit_limit:
    raise exceptions.DataOverflowError(
        "Code length overflow. Data size (%s) > size available (%s)" %
        (len(buffer), bit_limit))

关于0000000000A0000A000的输出:

bit_limit: 128
len(buffer): 131
buffer: 16.40.0.0.0.0.64.20.17.1.0.0.32.33.194.0.0

关于 000000000000000A000 的输出:

bit_limit: 128
len(buffer): 99
buffer: 16.60.0.0.0.0.0.0.32.33.194.0.0

您可以使用更大的上层版本bit_limit。

qr = qrcode.QRCode(
    version=2,      # use upper level version
    error_correction=qrcode.constants.ERROR_CORRECT_M,
)
> bit_limit: 224

这看起来确实像是 qrcode 中的错误。我能够在不同的 OS、python 版本和 qr 版本上重复这个问题。这似乎特别影响字母数字数据。我已将此问题报告为二维码 github 页面。

对于遇到此问题的其他人,我发现如果将 add_data 中的 optimize 参数设置为 0,则它会通过。即

qr.add_data(myStr, optimize=0)

我已经通过生成数千个特定长度的随机字母数字字符串并为所有字符串生成 QR 码来测试上述内容。我已经测试了不同的 QR 版本和纠错级别,我没有遇到任何失败。