Cómo validar sumas de comprobación de códigos QR y aplicar tolerancia a fallos en C

This article was translated from English: Does it need improvement?
Translated
View the article in English

Los flujos de trabajo de QR que procesan entradas del mundo real, como etiquetas impresas, capturas de cámara o documentos escaneados, se encontrarán con símbolos demasiado dañados para decodificarlos y con resultados que superan la suma de comprobación pero no superan la validación empresarial.

La corrección de errores Reed-Solomon soluciona automáticamente los daños físicos durante la decodificación. Si no se puede recuperar un símbolo, la colección de resultados queda vacía en lugar de parcial. La validación a nivel de aplicación es independiente e implica comprobar que el valor descodificado no esté vacío, coincida con el formato esperado o contenga un URI válido antes de continuar con el procesamiento.

Esta guía explica cómo validar las sumas de comprobación de los códigos QR y aplicar comprobaciones de tolerancia a fallos con la biblioteca IronQR.

Guía de inicio rápido: Validar sumas de comprobación de códigos QR

Lee un código QR y comprueba si la decodificación se ha realizado correctamente: un resultado no vacío significa que la suma de comprobación de Reed-Solomon ha pasado.

  1. Instala IronQR con el Administrador de Paquetes NuGet

    PM > Install-Package IronQR
  2. Copie y ejecute este fragmento de código.

    using IronQr;
    using IronSoftware.Drawing;
    
    var reader = new QrReader();
    IEnumerable<QrResult> results = reader.Read(new QrImageInput("label.png"));
    
    if (!results.Any())
    {
        Console.WriteLine("No QR code detected or decoding failed.");
        return;
    }
    
    Console.WriteLine(results.First().Value);
  3. Despliegue para probar en su entorno real

    Comienza a usar IronQR en tu proyecto hoy mismo con una prueba gratuita

    arrow pointer

Validación de sumas de comprobación de códigos QR

Los códigos QR utilizan la corrección de errores Reed-Solomon para detectar y reparar daños en los datos codificados. El nivel de corrección (Bajo al 7 %, Medio al 15 %, Cuartil al 25 % o Alto al 30 %) determina el porcentaje de palabras clave que se pueden perder y aún así recuperarse.

En cuanto a la lectura, la validación de la suma de comprobación se ejecuta internamente durante la decodificación. La clase QrResult no expone una propiedad de confianza; si existe un resultado en la colección, se pasa la suma de comprobación. Si la decodificación falla, la colección está vacía.

Entrada

Una etiqueta de producto con código QR que codifica https://ironsoftware.com/, generada con corrección de errores de nivel medio, que representa una etiqueta que puede haber sido manipulada o haber sufrido ligeros arañazos durante el transporte.

Codificación de códigos QR https://ironsoftware.com utilizada como entrada para la validación de la suma de comprobación
:path=/static-assets/qr/content-code-examples/how-to/checksum-and-fault-tolerance/checksum-validation.cs
using IronQr;
using IronSoftware.Drawing;

var reader = new QrReader();
IEnumerable<QrResult> results = reader.Read(new QrImageInput("damaged-label.png"));

// Reed-Solomon decoding is pass/fail — presence in results means valid checksum
if (!results.Any())
{
    // Decoding failed entirely — damage exceeded the error correction capacity
    Console.WriteLine("QR code could not be decoded. Consider re-scanning or using a higher error correction level at generation time.");
    return;
}

foreach (QrResult result in results)
{
    // Decoded successfully — validate the content matches expected format
    if (string.IsNullOrWhiteSpace(result.Value))
    {
        Console.WriteLine("QR decoded but produced an empty value.");
        continue;
    }

    Console.WriteLine($"Valid QR: {result.Value}");
}
Imports IronQr
Imports IronSoftware.Drawing

Dim reader As New QrReader()
Dim results As IEnumerable(Of QrResult) = reader.Read(New QrImageInput("damaged-label.png"))

' Reed-Solomon decoding is pass/fail — presence in results means valid checksum
If Not results.Any() Then
    ' Decoding failed entirely — damage exceeded the error correction capacity
    Console.WriteLine("QR code could not be decoded. Consider re-scanning or using a higher error correction level at generation time.")
    Return
End If

For Each result As QrResult In results
    ' Decoded successfully — validate the content matches expected format
    If String.IsNullOrWhiteSpace(result.Value) Then
        Console.WriteLine("QR decoded but produced an empty value.")
        Continue For
    End If

    Console.WriteLine($"Valid QR: {result.Value}")
Next
$vbLabelText   $csharpLabel

Resultado

La consola muestra el valor decodificado https://ironsoftware.com/, lo que confirma que la decodificación Reed-Solomon se ha realizado correctamente y que la carga útil se ha recuperado intacta.

Salida de terminal que muestra el código QR descodificado: https://ironsoftware.com

Para una mayor resistencia a los daños físicos, genere códigos QR con un nivel de corrección de errores más alto. El nivel alto recupera hasta un 30 % de la pérdida de datos a costa de un símbolo más grande.


Gestión del reconocimiento de formatos en la lectura de códigos QR

IronQR admite tres formatos de codificación QR: QR estándar, Micro QR y Micro QR rectangular. El escáner detecta automáticamente el formato durante la lectura. Tras el escaneo, el campo QrResult.QrType proporciona el formato detectado como un valor de enumeración.

Para los archivos PDF, utilice QrPdfInput en lugar de QrImageInput. El modo de escaneo determina el equilibrio entre velocidad y precisión: Auto combina la detección mediante aprendizaje automático con un escaneo clásico, OnlyDetectionModel utiliza únicamente el modelo de aprendizaje automático para un procesamiento más rápido, y OnlyBasicScan omite por completo el aprendizaje automático para obtener imágenes preprocesadas de alta calidad.

Entrada

Una etiqueta de producto en formato PNG (izquierda) y una captura de cámara en formato JPEG (derecha), que muestran la lectura adaptada al formato en dos tipos de entrada habituales.

product-label.png QR code used as input for format-aware reading
camera-capture.jpg JPEG QR code simulating a camera capture
:path=/static-assets/qr/content-code-examples/how-to/checksum-and-fault-tolerance/format-awareness.cs
using IronQr;
using IronSoftware.Drawing;
using IronQr.Enum;

// Read from an image file with ML + classic scan (default)
var reader = new QrReader();
IEnumerable<QrResult> results = reader.Read(new QrImageInput("product-label.png"));

foreach (QrResult result in results)
{
    // Inspect the detected QR format
    Console.WriteLine($"Format: {result.QrType}");   // QRCode, MicroQRCode, or RMQRCode
    Console.WriteLine($"Value:  {result.Value}");

    // Url is non-null only if Value is a valid URI
    if (result.Url != null)
    {
        Console.WriteLine($"URI:    {result.Url.AbsoluteUri}");
    }

    // Corner coordinates for positional context
    Console.WriteLine($"Corners: {result.Points.Length} points detected");
}

// Read from a bitmap with ML-only mode for faster throughput
var bitmap = AnyBitmap.FromFile("camera-capture.jpg");
var fastResults = reader.Read(new QrImageInput(bitmap, QrScanMode.OnlyDetectionModel));
Imports IronQr
Imports IronSoftware.Drawing
Imports IronQr.Enum

' Read from an image file with ML + classic scan (default)
Dim reader As New QrReader()
Dim results As IEnumerable(Of QrResult) = reader.Read(New QrImageInput("product-label.png"))

For Each result As QrResult In results
    ' Inspect the detected QR format
    Console.WriteLine($"Format: {result.QrType}")   ' QRCode, MicroQRCode, or RMQRCode
    Console.WriteLine($"Value:  {result.Value}")

    ' Url is non-null only if Value is a valid URI
    If result.Url IsNot Nothing Then
        Console.WriteLine($"URI:    {result.Url.AbsoluteUri}")
    End If

    ' Corner coordinates for positional context
    Console.WriteLine($"Corners: {result.Points.Length} points detected")
Next

' Read from a bitmap with ML-only mode for faster throughput
Dim bitmap As AnyBitmap = AnyBitmap.FromFile("camera-capture.jpg")
Dim fastResults = reader.Read(New QrImageInput(bitmap, QrScanMode.OnlyDetectionModel))
$vbLabelText   $csharpLabel

Resultado

La consola muestra el formato detectado, el valor descodificado, la URI resuelta y el recuento de esquinas de la etiqueta del producto, seguido del recuento de resultados del escaneo rápido de la captura de la cámara.

Salida de terminal que muestra Formato: QRCode, Valor: https://ironsoftware.com/product, URI y Esquinas: 4 puntos detectados

El campo QrType resulta útil cuando la aplicación requiere un formato específico. Por ejemplo, un sistema de almacén que solo genera códigos QR estándar puede filtrar las detecciones inesperadas de Micro QR o Micro QR rectangulares, que pueden indicar ruido o etiquetas no relacionadas. Cada formato tiene características de capacidad distintas: el QR estándar admite hasta 7089 caracteres numéricos, el Micro QR hasta 35, y el Micro QR rectangular ofrece un formato rectangular para espacios de etiqueta limitados.


Aplicación de comprobaciones de valores nulos a los resultados de códigos QR

QrReader.Read devuelve una colección vacía si no se encuentran códigos QR; Nunca devuelve null. Sin embargo, las propiedades de los resultados individuales aún requieren validación. Por ejemplo, Value puede estar vacío, y Url devuelve null si la cadena decodificada no es un URI válido.

Un patrón de validación robusto comprueba tres aspectos: el recuento de la colección, la integridad de los valores y la validez del tipo o del URI antes de pasar los datos a otro sistema.

Entrada

Una imagen en blanco sin código QR, que representa una página de documento en un lote mixto en el que algunas páginas no llevan ninguna etiqueta legible por máquina.

Imagen en blanco sin código QR utilizada como entrada para la demostración de comprobación de valores nulos
:path=/static-assets/qr/content-code-examples/how-to/checksum-and-fault-tolerance/null-checking-validator.cs
using IronQr;
using IronSoftware.Drawing;
using System.Collections.Generic;
using System.Linq;

public static class QrValidator
{
    public static List<QrResult> GetValidResults(
        string imagePath,
        QrEncoding? expectedFormat = null)
    {
        var reader = new QrReader();
        IEnumerable<QrResult> results = reader.Read(new QrImageInput(imagePath));

        // Guard: no QR codes detected
        if (!results.Any())
            return new List<QrResult>();

        return results
            .Where(r => !string.IsNullOrWhiteSpace(r.Value))
            .Where(r => expectedFormat == null || r.QrType == expectedFormat)
            .ToList();
    }
}

// Usage — only accept standard QR codes with non-empty values
var validated = QrValidator.GetValidResults(
    "shipping-manifest.png",
    expectedFormat: QrEncoding.QRCode);

if (validated.Count == 0)
{
    Console.WriteLine("No valid QR codes found for processing.");
    return;
}

foreach (var qr in validated)
{
    // Safe for downstream: value is non-empty, format is verified
    SendToInventoryApi(qr.Value, qr.Url?.AbsoluteUri);
}
Imports IronQr
Imports IronSoftware.Drawing
Imports System.Collections.Generic
Imports System.Linq

Public Module QrValidator
    Public Function GetValidResults(
        imagePath As String,
        Optional expectedFormat As QrEncoding? = Nothing) As List(Of QrResult)

        Dim reader As New QrReader()
        Dim results As IEnumerable(Of QrResult) = reader.Read(New QrImageInput(imagePath))

        ' Guard: no QR codes detected
        If Not results.Any() Then
            Return New List(Of QrResult)()
        End If

        Return results _
            .Where(Function(r) Not String.IsNullOrWhiteSpace(r.Value)) _
            .Where(Function(r) expectedFormat Is Nothing OrElse r.QrType = expectedFormat) _
            .ToList()
    End Function
End Module

' Usage — only accept standard QR codes with non-empty values
Dim validated = QrValidator.GetValidResults(
    "shipping-manifest.png",
    expectedFormat:=QrEncoding.QRCode)

If validated.Count = 0 Then
    Console.WriteLine("No valid QR codes found for processing.")
    Return
End If

For Each qr In validated
    ' Safe for downstream: value is non-empty, format is verified
    SendToInventoryApi(qr.Value, qr.Url?.AbsoluteUri)
Next qr
$vbLabelText   $csharpLabel

Resultado

La consola muestra la respuesta de resultado vacío del validador: no se han detectado códigos QR, por lo que la colección está vacía y no se procesan datos en las fases posteriores.

Salida de terminal que muestra

El validador devuelve una lista vacía (nunca nula), lo que elimina la necesidad de comprobar si hay valores nulos en el punto de llamada. El parámetro opcional expectedFormat actúa como un filtro de formato, de modo que el código de llamada solo recibe resultados que coinciden con el tipo de formato esperado. La propiedad Url utiliza el operador condicional nulo para gestionar de forma segura tanto cargas útiles URI como no URI.

Para flujos de trabajo asíncronos, aplica los mismos patrones de validación a ReadAsync: espera la llamada y utiliza comprobaciones idénticas en la colección resultante.


Más información

Consulte las opciones de licencia cuando esté listo para la producción.

Haga clic aquí para descargar el proyecto completo de la aplicación de consola ChecksumFaultToleranceTest.

Curtis Chau
Escritor Técnico

Curtis Chau tiene una licenciatura en Ciencias de la Computación (Carleton University) y se especializa en el desarrollo front-end con experiencia en Node.js, TypeScript, JavaScript y React. Apasionado por crear interfaces de usuario intuitivas y estéticamente agradables, disfruta trabajando con frameworks modernos y creando manuales bien ...

Leer más
¿Listo para empezar?
Nuget Descargas 63,625 | Versión: 2026.4 recién lanzado
Still Scrolling Icon

¿Aún desplazándote?

¿Quieres una prueba rápida? PM > Install-Package IronQR
ejecuta una muestra observa cómo tu URL se convierte en un código QR.