Skip to content

QR Code Generator — PHP 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 PHP implementation — the same logic the interactive tool runs, in a shareable, citable form.

<?php
/**
 * qr-code-generator - QR format information (BCH).
 *
 * Display snippet: assembling the module matrix is too long to show here;
 * this ports formatInfoBCH($data5) from the TypeScript lib
 * (src/lib/qr.ts). 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.
 */

const EC_FORMAT_BITS = ['L' => 0b01, 'M' => 0b00, 'Q' => 0b11, 'H' => 0b10];

/** 15-bit format info string (MSB first) for ($ecLevel, $mask). */
function formatInfo(string $ecLevel, int $mask): string
{
    return formatInfoBCH((EC_FORMAT_BITS[$ecLevel] << 3) | $mask);
}

/** 15-bit format info string (MSB first) for a 5-bit data value. */
function formatInfoBCH(int $data5): string
{
    $v = $data5 << 10;
    $g = 0x537; // BCH(15,5) generator polynomial
    for ($i = 14; $i >= 10; $i--) {
        if ($v & (1 << $i)) {
            $v ^= $g << ($i - 10); // polynomial long division
        }
    }
    $full = (($data5 << 10) | ($v & 0x3FF)) ^ 0x5412; // apply the mask pattern
    return sprintf('%015b', $full);
}

// Example:
//   formatInfo('L', 0) -> '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 →