有效输入

时间:2017-11-07 22:30:36

标签: python qr-code

我正在尝试使用qrcode包生成自定义QR码,但我遇到了一个问题,似乎它在有效输入上失败了。我想知道这是否是包中的错误或我不熟悉的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,Python 2.7,qrcode版本5.3,Pillow

2 个答案:

答案 0 :(得分:1)

错误

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

指向由 qrcode 创建的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

答案 1 :(得分:0)

这看起来像qrcode中的错误。我能够在不同的OS,python版本和qr版本上重复这个问题。这似乎特别影响字母数字数据。我在qrcode github页面上报告了这个问题。

对于遇到这种情况的其他人,我发现如果我将optimize中的add_data参数设置为0,那么它就会通过。即。

qr.add_data(myStr, optimize=0)

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