Cómo validar sumas de comprobación de códigos QR y aplicar tolerancia a fallos en C
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.
Este tutorial explica cómo validar sumas de control de códigos QR y aplicar verificaciones de tolerancia a fallas 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.
-
Instala IronQR con el Administrador de Paquetes NuGet
PM > Install-Package IronQR -
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); -
Despliegue para probar en su entorno real
Comienza a usar IronQR en tu proyecto hoy mismo con una prueba gratuita
Flujo de trabajo mínimo (5 pasos)
- Descarga la biblioteca IronQR C# para la validación de la suma de comprobación de códigos QR
- Cargar una imagen con
QrImageInput - Llama a
QrReader.Readpara decodificar la imagen y ejecutar la validación Reed-Solomon automáticamente - Comprueba la colección de resultados para confirmar que la decodificación se ha realizado correctamente, ya que una colección vacía significa un error
- Comprueba que el valor descodificado cumple los requisitos de la aplicación antes de pasarlo a la fase siguiente
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 QR con codificación https://ironsoftware.com/, generada con corrección de error Media, representando una etiqueta que puede haber sido manipulada o ligeramente rayada en tránsito.
: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
Resultado
La consola muestra el valor decodificado https://ironsoftware.com/, confirmando que la decodificación Reed-Solomon tuvo éxito y la carga útil fue recuperada intacta.
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. Después de escanear, el campo QrResult.QrType proporciona el formato detectado como un valor de enumeración.
Para PDFs, use QrPdfInput en lugar de QrImageInput. El modo de escaneo determina el equilibrio entre velocidad y precisión: Auto combina la detección por aprendizaje automático con un escaneo clásico, OnlyDetectionModel utiliza solo el modelo de ML para un procesamiento más rápido, y OnlyBasicScan omite ML completamente para 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.
Etiqueta del producto (PNG)
Captura de cámara (JPEG)
: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))
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.
El campo QrType es ú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 nulo 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.
: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
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.
El validador devuelve una lista vacía (nunca nula), eliminando la necesidad de verificar nulo en el punto de llamada. El parámetro opcional expectedFormat actúa como un filtro de formato, por lo que el código llamante recibe solo los resultados que coinciden con el tipo de formato esperado. La propiedad Url utiliza el operador condicional nulo para manejar de manera segura tanto las cargas útiles URI como las no URI.
Para flujos de trabajo asincrónicos, aplique los mismos patrones de validación a ReadAsync: espere la llamada y use verificaciones idénticas en la colección resultante.
Más información
- Niveles de corrección de errores: configuración de la resiliencia en tiempo de escritura y del nivel de corrección.
- Guía práctica para leer códigos QR: opciones de formato de entrada y patrones de lectura.
- Referencia de la API de QrResult: superficie de propiedades completa.
- Ejemplos de escaneo avanzado: configuraciones del modo de escaneo.
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.
Preguntas Frecuentes
¿Cuál es el propósito de validar checksums de códigos QR en C#?
La validación de checksums de códigos QR en C# garantiza la integridad de los datos verificando que los datos codificados en el código QR sean precisos y no hayan sido corrompidos durante la transmisión o el escaneo. IronQR puede asistir en este proceso proporcionando una verificación confiable de checksums.
¿Cómo maneja IronQR la detección de formatos de códigos QR?
IronQR proporciona capacidades robustas para detectar varios formatos de códigos QR, asegurando compatibilidad con una amplia gama de estándares de códigos QR. Esta característica ayuda a los desarrolladores a manejar códigos QR de manera eficiente en sus aplicaciones C#.
¿Qué papel juega la corrección de errores de Reed-Solomon en la validación de códigos QR?
La corrección de errores de Reed-Solomon es un método utilizado en los códigos QR para corregir errores que ocurren durante el escaneo. IronQR aprovecha esta técnica para mejorar la tolerancia a fallos, permitiéndole leer y validar códigos QR con precisión incluso con cierto nivel de distorsión o daño.
¿Puede IronQR aplicar patrones seguros para nulos cuando trabaja con códigos QR?
Sí, IronQR puede aplicar patrones seguros para nulos, lo que ayuda a prevenir errores de referencia nula al manejar datos de códigos QR. Esto asegura que su aplicación pueda procesar códigos QR de manera más confiable y eficiente.
¿Por qué es importante la tolerancia a fallos en el procesamiento de códigos QR?
La tolerancia a fallos es crucial porque permite que los sistemas de procesamiento de códigos QR manejen errores y discrepancias sin fallar. Las capacidades de tolerancia a fallos de IronQR aseguran que incluso códigos QR parcialmente dañados u oscurecidos puedan leerse con precisión.
¿Cuáles son los beneficios de usar IronQR para la validación de códigos QR en C#?
IronQR ofrece varios beneficios para la validación de códigos QR, incluyendo alta precisión, soporte para múltiples formatos de códigos QR, y mecanismos de corrección de errores integrados, lo que lo convierte en una elección ideal para desarrolladores que trabajan con códigos QR en C#.
¿Cómo mejora IronQR la precisión de lectura de códigos QR?
IronQR mejora la precisión de lectura utilizando algoritmos avanzados para detectar y decodificar códigos QR, así como aplicando métodos de corrección de errores como Reed-Solomon para manejar cualquier corrupción de datos durante el escaneo.

