Triển khai mã QR với thư viện nayuki-qrcodegen trong C/C++

Tổng quan thư viện

QRCodegen là thư viện mã nguồn mở hỗ trợ tạo mã QR đa nền tảng, cung cấp phiên bản cho C, C++, Java, JavaScript, Python và Rust. Bài viết tập trung vào ứng dụng thực tế với phiên bản C/C++.

Triển khai trên C

Phiên bản C không sử dụng cấp phát bộ nhớ động, phù hợp cho hệ thống nhúng. Ví dụ minh họa:

#include <stdbool.h>
#include <stdio.h>
#include "qrcodegen.h"

void renderQR(const uint8_t *qrData);

int main() {
    const char *input = "Xin chào!";
    enum qrcodegen_Ecc eccLevel = qrcodegen_Ecc_MEDIUM;
    uint8_t qrBuffer[qrcodegen_BUFFER_LEN_MAX];
    uint8_t tempBuffer[qrcodegen_BUFFER_LEN_MAX];
    
    bool success = qrcodegen_encodeText(
        input,
        tempBuffer,
        qrBuffer,
        eccLevel,
        qrcodegen_VERSION_MIN,
        qrcodegen_VERSION_MAX,
        qrcodegen_Mask_3,
        true
    );
    
    if(success) renderQR(qrBuffer);
    return 0;
}

void renderQR(const uint8_t *qrData) {
    int dimension = qrcodegen_getSize(qrData);
    for(int y = 0; y < dimension + 4; y++) {
        for(int x = 0; x < dimension + 4; x++) {
            printf("%s", qrcodegen_getModule(qrData, x-2, y-2) ? "██" : "  ");
        }
        printf("\n");
    }
}

Thành phần chính

Cấp độ sửa lỗi

enum qrcodegen_Ecc {
    qrcodegen_Ecc_LOW,      // Sửa 7% lỗi
    qrcodegen_Ecc_MEDIUM,   // Sửa 15% lỗi
    qrcodegen_Ecc_QUARTILE, // Sửa 25% lỗi
    qrcodegen_Ecc_HIGH      // Sửa 30% lỗi
};

Chế độ dữ liệu

enum qrcodegen_Mode {
    qrcodegen_Mode_NUMERIC,      // Số
    qrcodegen_Mode_ALPHANUMERIC, // Chữ và số
    qrcodegen_Mode_BYTE,         // Dữ liệu nhị phân
    qrcodegen_Mode_KANJI         // Chữ Kanji
};

Triển khai trên C++

Phiên bản C++ sử dụng đối tượng lớp với bộ nhớ động:

#include <iostream>
#include "qrcodegen.hpp"

void displayQR(const qrcodegen::QrCode &qr);

int main() {
    try {
        auto qr = qrcodegen::QrCode::encodeText("Hello C++", 
                qrcodegen::QrCode::Ecc::HIGH);
        displayQR(qr);
    } catch (const qrcodegen::data_too_long &e) {
        std::cerr << "Lỗi: " << e.what();
        return 1;
    }
    return 0;
}

void displayQR(const qrcodegen::QrCode &qr) {
    int border = 1;
    for (int y = -border; y < qr.getSize() + border; y++) {
        for (int x = -border; x < qr.getSize() + 1; x++) {
            std::cout << (qr.getModule(x, y) ? "▓▓" : "░░");
        }
        std::cout << "\n";
    }
}

Giới hạn dữ liệu

Version Kích thước Sửa lỗi Số Chữ-số Nhị phân
1 21x21 LOW 41 25 17
10 57x57 MEDIUM 513 311 213
20 97x97 HIGH 919 557 382
40 177x177 QUARTILE 3993 2420 1663

Thẻ: QRCode C++ C embedded systems Data Encoding

Đăng vào ngày 17 tháng 6 lúc 02:10