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 |