Corpus de prueba público
Nuestras afirmaciones de compatibilidad de escáneres son tan buenas como la evidencia en la que se basan. Esta página es el corpus, las entradas con las que sometemos a prueba regresiva nuestras familias de codificadores, más el comportamiento de la cámara del teléfono que puedes auditar tú mismo sin creer en nuestra palabra.
Descargar corpus.zip JSON + CSV de fixtures + metodología + README. ~4 KB.
Cargando versión…
Cómo usar el corpus
Cada vector de prueba está en /test-vectors/fixtures.json. Un objeto JSON por tipo con los campos de entrada y las subcadenas decodificadas esperadas. Obtenido en tiempo real desde este sitio, sin copias obsoletas.
Toma el mapa de fields de cualquier fixture, introduce los valores en el generador para ese tipo y pulsa Generar. El QR resultante es bit a bit idéntico al que nuestro CI procesa en ida y vuelta.
Apunta una cámara iPhone, cámara Android, Google Lens, escáner industrial (Zebra, Honeywell, Datalogic) o lector específico de la app (app bancaria, autenticador) al QR generado. Confirma que el texto decodificado contiene cada subcadena expect de ese fixture.
Si un escáner de tu flota devuelve una decodificación que no coincide con el fixture, abre un issue. Lo reproduciremos, añadiremos tu escáner a la matriz de compatibilidad pública y (si es un bug del codificador) enviaremos una corrección.
Resultados de escaneo esperados
Se renderiza desde el mismo conjunto de datos que la matriz de compatibilidad y la línea «Se escanea en» de cada página de tipo, así que las tres no pueden contradecirse. El archivo completo de fixtures en /test-vectors/ tiene 33 entradas, una por cada familia de codificadores que sometemos a prueba regresiva; no es una fila por cada tipo de producto, y no afirmamos que lo sea.
| Tipo | Entrada del fixture | iPhone Camera | Android Camera | Lector profesional |
|---|---|---|---|---|
| URL | https://example.com/test | Abre el enlaceA1 | Abre el enlaceA5 | DecodificaA8 |
| WiFi | WIFI:S:MyNet;T:WPA;P:...;; | Se une a la redA1 | Se une a la redA5 | Decodifica el payloadA8 |
| WiFi Enterprise (EAP) | WPA2-EAP PEAP identity=alice@corp | iOS 17+, reportadoU | Decodifica; unirse depende del fabricanteU | Decodifica el payloadQ |
| vCard | FN=Alice ORG=Acme ... | Añadir a ContactosA1 | Añadir a ContactosA5 | Decodifica el payloadA8 |
| TOTP | otpauth://totp/...?secret=JBSW... | La app de autenticación lo leeA9, A10 | La app de autenticación lo leeA9, A10 | Decodifica el URIA8 |
| eSIM | LPA:1$rsp.example.com$K2-LM... | iOS 17.4+ aprovisionaA4 | Android 13+ aprovisionaU | Decodifica el URIQ |
| Bitcoin (BIP-21) | bitcoin:1A1zP1eP... | Abre la app de carteraQ | Abre la app de carteraQ | Decodifica el URIQ |
| SEPA (EPC) | BCD header + name + IBAN + amount | Solo cadena en brutoQ | Solo cadena en brutoQ | Decodifica la cadena en brutoQ |
| Swiss QR-bill | SPC header + IBAN + address + amount | Solo cadena en brutoQ | Solo cadena en brutoQ | Decodifica la cadena en brutoQ |
| Micro QR | Compact payload | Sin decodificaciónV, U | Sin decodificaciónG | Lectores industrialesZ |
| rMQR | Rectangular payload | Sin decodificaciónU | Sin decodificaciónG | Firmware más reciente de Zebra, Scandit y CognexZ |
| GS1 Digital Link | https://id.gs1.org/01/09506000134352 | Abre la URLQ | Abre la URLQ | El firmware del TPV analiza los AIsQ |
| Aztec | Arbitrary payload | Sin decodificaciónA2 | Google Lens, algunas variantesA7 | NativoA8 |
| Data Matrix | Arbitrary payload | Sin decodificaciónA2 | Google LensA6 | NativoA8 |
| PDF417 | AAMVA or arbitrary | Sin decodificaciónA2 | Google Lens, irregularA7 | NativoA8 |
| AAMVA driver license | @\n\x1e\rANSI 636014100002DL... | iOS 17+, flujo compatible con licenciasA3 | Solo apps compatibles con licenciasU | NativoA8 |
| EAN-13 / UPC-A | 0012345678905 | Sin decodificaciónAp | Google LensG | Todo TPV de retailA8 |
| Code 128 | ABC-123 | Sin decodificaciónAp | Google LensG | NativoA8 |
Cómo leer las marcas
- ✓: lo lee desde la app de cámara de serie, sin necesitar una app adicional
- ~: lo lee bajo una condición indicada en la celda (una app específica, una versión de SO o un modo)
- ✗: no lo decodifica; necesitas una app de escáner o hardware
Evidencia
- A: our own device test; the number is the row in the attestation log
- Ap: Apple's support page describes the Camera app and Code Scanner as reading QR codes and lists no other symbology
- G: Google Lens decodes the ML Kit barcode formats: Codabar, Code 39, Code 93, Code 128, EAN-8, EAN-13, ITF, UPC-A, UPC-E, Aztec, Data Matrix, PDF417 and QR Code; Micro QR and rMQR are not on the list
- Z: Zebra lists Micro QR and rectangular Micro QR among the DS8100 series' 2D symbologies
- V: Apple's Vision framework decodes Micro QR for third-party apps since iOS 15; that is a developer API, not the Camera app
- Q: a standard QR symbol, so decoding is the attested QR result; the question is what the phone does with the payload
- U: not in our attestation log yet; from vendor documentation or field reports, treat as provisional
Qué significa "resultado de escaneo esperado"
- Decodes, Decodifica, el lector nativo del teléfono devuelve el payload sin necesitar una app separada.
- Partial, Parcial, la decodificación depende de una app específica (autenticador, cartera, banco) o de una versión específica del OS.
- No decode, Sin decodificación, la cámara nativa no devuelve nada. Requiere un escáner o lector especializado.
- Las letras pequeñas junto a cada resultado indican la evidencia: una A seguida de un número es una fila del registro de atestación de abajo; otras letras son documentación del proveedor, listada debajo de cada tabla. Una U significa que aún no hemos pasado esa celda por nuestros propios dispositivos.
Notas de metodología
- Todos los fixtures son de ida y vuelta. Nuestro CI genera cada código en Chromium sin cabeza, lo decodifica de nuevo mediante la API
BarcodeDetectordel navegador y verifica la coincidencia de subcadenas. Un CI verde significa que el corpus es internamente consistente. - Los resultados del escáner en esta tabla provienen de pruebas manuales en dispositivos reales. Sin síntesis. iPhone 15 Pro en iOS 18.3, Pixel 8 en Android 14, Zebra DS8100 imager en firmware CAAACS00-002-R06.
- Publicamos resultados negativos. Si la cámara iPhone se niega a decodificar una simbología (Data Matrix, Aztec, PDF417), eso es un 'Sin decodificación' en la tabla, no una redenominación de 'lector nativo'.
- El corpus está versionado. Cuando añadimos un tipo o corregimos un bug del codificador, la entrada del fixture correspondiente se envía en el mismo commit. El registro de cambios anota cada cambio de fixture, y corpus.VERSION.txt lleva el hash del archivo de fixtures con el que se generó el ZIP actual.
Registro de atestación de flota de escáneres
Cada ejecución manual en un dispositivo, fechada. Se añaden filas cuando adquirimos hardware o un usuario reporta una discrepancia; un resultado nunca cambia en silencio, recibe una fila nueva.
| # | Device | OS / app | Corpus slice | Result | Date | Notes |
|---|---|---|---|---|---|---|
| A1 | iPhone 15 Pro | iOS 18.3, native Camera | All QR fixtures | pass | 2026-04-10 | |
| A2 | iPhone 15 Pro | iOS 18.3, native Camera | Aztec, PDF417, Data Matrix | fail | 2026-04-10 | Ninguno decodifica de forma nativa (esperado, ver /standards/non-qr-2d/) |
| A3 | iPhone 15 Pro | iOS 18.3, native Camera | AAMVA PDF417 | partial | 2026-04-10 | El flujo compatible con licencias de iOS 17+ ofrece Añadir a Wallet; no devuelve el PDF417 en bruto |
| A4 | iPhone 15 Pro | iOS 18.3, Wallet | eSIM LPA | pass | 2026-04-12 | El flujo de añadir eSIM se activa correctamente |
| A5 | Pixel 8 | Android 14, native Camera | All QR fixtures | pass | 2026-04-10 | |
| A6 | Pixel 8 | Android 14, Google Lens | Data Matrix | pass | 2026-04-10 | |
| A7 | Pixel 8 | Android 14, Google Lens | Aztec, PDF417 | partial | 2026-04-10 | Algunas variantes decodifican; el soporte es irregular |
| A8 | Zebra DS8100 | firmware CAAACS00-002-R06 | All 2D + 1D fixtures | pass | 2026-04-11 | Lector de imagen industrial, referencia canónica |
| A9 | Google Authenticator | v7.0+ (iOS/Android) | TOTP, HOTP | pass | 2026-04-12 | Solo SHA-1, 6 dígitos (ignora los parámetros algorithm/digits según el perfil de facto de Google) |
| A10 | 1Password | v8 (iOS/Android/macOS) | TOTP, HOTP | pass | 2026-04-12 | Soporte completo del RFC, incl. SHA-256, SHA-512, 8 dígitos |
Próximamente
- Artefactos pre-renderizados. El ZIP actual incluye fixtures + metodología + CSV. Una revisión futura añadirá SVG + PNG pre-renderizados de cada fixture para que puedas insertarlos directamente en un harness de flota de escáneres. Paso de navegador sin cabeza en tiempo de compilación pendiente.
- Atestación de flota de escáneres. El registro fechado de dispositivos se publica en esta página y crece cada vez que verificamos contra un nuevo dispositivo.
- Verificación de terceros. Un laboratorio de seguridad independiente ejecuta el corpus a través de una flota de escáneres y publica una atestación firmada. Pendiente, encargado; el informe se publicará aquí a su llegada.
Ver también
- /test-vectors/, JSON completo de fixtures y tabla buscable.
- /compatibility/, matriz de compatibilidad de escáneres en vivo.
- /standards/, páginas de referencia por estándar.
- /print-size/, guía de impresión física que acompaña al corpus.