Skip to content

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

# qr-code-generator — Ruby 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.

# Error-correction level indicator bits (ISO/IEC 18004 table C.1).
EC_FORMAT_BITS = { 'L' => 0b01, 'M' => 0b00, 'Q' => 0b11, 'H' => 0b10 }.freeze

# 15-bit format info string (MSB first) for (ec_level, mask).
def format_info(ec_level, mask)
  format_info_bch((EC_FORMAT_BITS.fetch(ec_level) << 3) | mask)
end

# 15-bit format info string (MSB first) for a 5-bit data value.
def format_info_bch(data5)
  v = data5 << 10
  g = 0x537 # BCH(15,5) generator polynomial
  (14.downto(10)).each do |i|
    v ^= g << (i - 10) if (v & (1 << i)) != 0 # polynomial long division
  end
  full = ((data5 << 10) | (v & 0x3FF)) ^ 0x5412 # apply the mask pattern
  format('%015b', full)
end

# Example:
#   format_info('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 →