如何查询二维码具体参数信息?

如何查询一个二维码在生成的时候,采用了哪些参数?
包括容错率、版本、掩码类型。

谢谢!

版本似乎是6(41×41)。

对于这个二维码,信息如下:

version = 6
ecLevel = H
formatInfo.getDataMask() = 2 -> DATA_MASK_010

掩码应该是 j % 3 == 0 的那个( QR Code Mask Patterns - Reed–Solomon codes for coders - Wikiversity

具体获取起来有些麻烦… 我一开始想从 pip 和 npm 上找相关的库,不过似乎现有的 QR Reader 库大多都是更底层工具的封装,除了结果、定位点、错误校正等级之外,能提供的其他的信息甚少。然后又尝试了 ZXing,但其暴露的公开 API 也没能提供更多信息。最后是把源码拉到本地,进到对应的方法里直接把内部数据打出来,才得到了掩码和版本信息。hook 位置位于:

com.google.zxing.qrcode.decoder.Decoder#decode(BitMatrixParser, java.util.Map<DecodeHintType,?>)
com.google.zxing.qrcode.decoder.BitMatrixParser#readCodewords

(如果需要完整代码,请论坛私信我,项目比较大不太方便直接上传论坛)

1 个赞

这个二维码所包含的数据是

1653324575063e323362a-e342-445b-bdf9-2e7ca0fba605

然而在使用 Zint Barcode Studio 工具生成时,即使带入了上面的参数(版本6,容错H,掩码2),生成的二维码却是这样的:


虽然和原贴里的二维码扫描出来的数据一样,但是图形却是大不一样。
难道还有我没有考虑到的其他的参数吗?
求大佬解答,谢谢!

这个在线二维码生成器可以生成原贴的二维码,但是给出的参数太少,能不能通过分析网页破译它的算法呢?

我用 ZXing,似乎只需要指定 ECLEVEL 就可以生成和原始文件一致的二维码,不需要指定 MASK 和 VERSION。感觉可能和生成器的内部实现有关(毕竟 MASK, VERSION 应该是根据数据自动选取最合适的),不过我对 QR Spec 也不是很熟悉。

    private static void generateQRCodeImage()
            throws WriterException, IOException {
        String filePath = "mine.png";
        QRCodeWriter qrCodeWriter = new QRCodeWriter();
        String text = "1653324575063e323362a-e342-445b-bdf9-2e7ca0fba605";
        Map<EncodeHintType, Object> hints = new HashMap<>();
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
        hints.put(EncodeHintType.MARGIN, 1);
//        hints.put(EncodeHintType.QR_MASK_PATTERN, 2);
//        hints.put(EncodeHintType.QR_VERSION, 6);
        BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, 516, 516, hints);

        Path path = FileSystems.getDefault().getPath(filePath);
        MatrixToImageWriter.writeToPath(bitMatrix, "PNG", path);
    }