Skip to content

QR Code Generator — C++ source

Turn any text or URL into a downloadable QR code. Full ISO encoder with all error-correction levels, versions 1-40, SVG and PNG export, colors and quiet-zone control — runs entirely in your browser.

This is the C++ implementation — the same logic the interactive tool runs, in a shareable, citable form.

// qr-code-generator — C++ port: QR format information (BCH).
//
// Display snippet: assembling the module matrix is too long to show here;
// this ports formatInfoString(ecLevel, mask) from the TypeScript lib
// (src/lib/qr.ts), split into the EC-bits lookup and the BCH remainder.
// The full encoder (modes, Reed-Solomon EC, masking, matrix) lives in the
// TypeScript/Go sources.
//
// The 15-bit format string protects 5 data bits — 2 error-correction level
// bits (L=01 M=00 Q=11 H=10) followed by the 3-bit mask pattern — with a
// BCH(15,5) code using generator 0x537, then XORs the result with the
// fixed 0x5412 pattern so an all-zero string is never valid.
#include <bitset>
#include <cstdint>
#include <optional>
#include <string>

std::string format_info_bch(uint16_t data5);

// Error-correction level indicator bits (ISO/IEC 18004 table C.1).
static std::optional<uint16_t> ec_format_bits(char ec_level)
{
    switch (ec_level) {
    case 'L': return 0b01;
    case 'M': return 0b00;
    case 'Q': return 0b11;
    case 'H': return 0b10;
    default:  return std::nullopt;
    }
}

// 15-bit format info string (MSB first) for (ec_level, mask); nullopt on unknown level.
std::optional<std::string> format_info(char ec_level, uint16_t mask)
{
    const auto bits = ec_format_bits(ec_level);
    if (!bits)
        return std::nullopt;
    return format_info_bch((*bits << 3) | mask);
}

// 15-bit format info string (MSB first) for a 5-bit data value.
std::string format_info_bch(uint16_t data5)
{
    uint16_t v = data5 << 10;
    constexpr uint16_t G = 0x537; // BCH(15,5) generator polynomial
    for (int i = 14; i >= 10; --i) {
        if (v & (uint16_t{1} << i))
            v ^= G << (i - 10); // polynomial long division
    }
    const uint16_t full = ((data5 << 10) | (v & 0x3FF)) ^ 0x5412; // apply the mask pattern
    return std::bitset<15>{full}.to_string();
}

// Example:
//   format_info('L', 0)->value() == "111011111000100" (0x77C4, matching the published tables)

Also available in 13 other languages

Every CosmoDev tool ships its pure logic in TypeScript (web) and Go (CLI), with authored implementations in a dozen-plus languages — the same contract, ported. Compare all languages side by side →