Cómo validar las sumas de comprobación de códigos de barras y utilizar la lectura sensible al formato en C#

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

Las sumas de comprobación de los códigos de barras existen para detectar errores de sustitución: un solo dígito transpuesto en una etiqueta EAN-13 puede enviar un paquete al almacén equivocado. La lectura sensible al formato añade una segunda capa de validación: restringir el decodificador a simbologías esperadas elimina falsos positivos de ruido de fondo y reduce el tiempo de escaneo al omitir detectores de formato irrelevantes.

IronBarcode maneja la verificación de suma de comprobación implícitamente durante la decodificación: el algoritmo de dígitos de verificación de cada simbología se ejecuta automáticamente y los códigos de barras que no pasan la verificación se descartan antes de que los resultados lleguen al código de llamada. La BarcodeReaderOptions.ExpectBarcodeTypes propiedad restringe las lecturas a formatos específicos, y RemoveFalsePositive añade un pase de verificación secundaria. Este artículo cubre el comportamiento de la suma de comprobación, la lectura restringida por formato y el patrón combinado de validación.

Inicio rápido: Validar códigos de barras con restricciones de suma de comprobación y formato

Configura BarcodeReaderOptions con ExpectBarcodeTypes y RemoveFalsePositive para restringir las lecturas a simbologías esperadas con verificación automática de suma de comprobación.

  1. Instala IronBarcode con el Administrador de Paquetes NuGet

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

    using IronBarCode;
    
    // Format-constrained read with false-positive removal
    var options = new BarcodeReaderOptions
    {
        ExpectBarcodeTypes = BarcodeEncoding.EAN13 | BarcodeEncoding.Code128,
        RemoveFalsePositive = true,
        Speed = ReadingSpeed.Balanced
    };
    
    BarcodeResults results = BarcodeReader.Read("label.png", options);
  3. Despliegue para probar en su entorno real

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

    arrow pointer

¿Cómo validar las sumas de comprobación de códigos de barras?

IronBarcode valida las sumas de comprobación en el momento de decodificación como parte de la especificación de cada simbología. Cuando la biblioteca lee un código de barras EAN-13, el dígito de control Mod10 se calcula a partir de los primeros 12 dígitos y se compara con el 13º. Una discrepancia hace que el código de barras sea rechazado silenciosamente: nunca aparece en la colección BarcodeResults. El mismo principio se aplica a cada formato con un dígito de control obligatorio: UPC-A, UPC-E, EAN-8, Code128, ITF, y otros.

Este modelo implícito difiere de las bibliotecas que exponen un interruptor explícito. La tabla a continuación compara los dos enfoques:

Comparación del modelo de validación de suma de comprobación: IronBarcode vs. Aspose.BarCode
AspectoIronBarcodeAspose.BarCode
Disparador de validaciónAutomático: se ejecuta durante cada decodificaciónExplícito: `Suma de comprobaciónValidation.On` / `Off` / `Default`
Acción requerida por el desarrolladorNinguna: los códigos de barras no válidos se excluyen de los resultadosDebe establecer `BarcodeSettings.Suma de comprobaciónValidation` antes de leer
¿Deshabilitar suma de comprobación?No expuesto: las sumas de comprobación siempre se aplican a formatos obligatoriosSí — `Suma de comprobaciónValidation.Off` omite la verificación
Formatos de suma de comprobación opcional (Code39)El lector utiliza `Confidence` + `RemoveFalsePositive` para filtrar lecturas de baja calidadDebe habilitar explícitamente con `EnableSuma de comprobación.Sí`
Comportamiento de fallosCódigo de barras omitido silenciosamente de los resultadosEl código de barras puede aparecer con un valor de suma de comprobación separado para inspección manual

La consecuencia práctica: el código de llamada que recibe un BarcodeResult de IronBarcode puede confiar en que el dígito de control es válido para cualquier formato con una suma de comprobación obligatoria. No hay ningún paso de configuración a olvidar ni ningún indicador que dejar accidentalmente en el estado incorrecto.

Para simbologías donde las sumas de comprobación son opcionales — Code39 siendo el ejemplo principal — la biblioteca confía en la puntuación de confianza y el mecanismo RemoveFalsePositive en lugar de un interruptor de suma de comprobación explícito. La propiedad Confidence en cada BarcodeResult informa con cuánta fiabilidad se decodificó el código de barras, y el ConfidenceThreshold en BarcodeReaderOptions (por defecto 0.7) establece la base de detección ML.

//:path=/static-assets/barcode/content-code-examples/how-to/checksum-and-format-validation/checksum-confidence.cs
using IronBarCode;

var options = new BarcodeReaderOptions
{
    ExpectBarcodeTypes = BarcodeEncoding.AllOneDimensional,
    RemoveFalsePositive = true,
    ConfidenceThreshold = 0.85,
    Speed = ReadingSpeed.Detailed
};

BarcodeResults results = BarcodeReader.Read("warehouse-rack.png", options);

foreach (BarcodeResult result in results)
{
    // Every result here has passed checksum validation (mandatory formats)
    // and exceeded the 85% confidence threshold (all formats)
    Console.WriteLine($"[{result.BarcodeType}] {result.Valor} — Confidence: {result.Confidence}%");
}

if (results.Count == 0)
{
    Console.Error.WriteLine("No valid barcodes found. Possible causes:");
    Console.Error.WriteLine("  - Check digit mismatch (barcode silently rejected)");
    Console.Error.WriteLine("  - Confidence below 85% threshold");
    Console.Error.WriteLine("  - Format not in ExpectBarcodeTypes");
}
//:path=/static-assets/barcode/content-code-examples/how-to/checksum-and-format-validation/checksum-confidence.cs
using IronBarCode;

var options = new BarcodeReaderOptions
{
    ExpectBarcodeTypes = BarcodeEncoding.AllOneDimensional,
    RemoveFalsePositive = true,
    ConfidenceThreshold = 0.85,
    Speed = ReadingSpeed.Detailed
};

BarcodeResults results = BarcodeReader.Read("warehouse-rack.png", options);

foreach (BarcodeResult result in results)
{
    // Every result here has passed checksum validation (mandatory formats)
    // and exceeded the 85% confidence threshold (all formats)
    Console.WriteLine($"[{result.BarcodeType}] {result.Valor} — Confidence: {result.Confidence}%");
}

if (results.Count == 0)
{
    Console.Error.WriteLine("No valid barcodes found. Possible causes:");
    Console.Error.WriteLine("  - Check digit mismatch (barcode silently rejected)");
    Console.Error.WriteLine("  - Confidence below 85% threshold");
    Console.Error.WriteLine("  - Format not in ExpectBarcodeTypes");
}
$vbLabelText   $csharpLabel

Elevar ConfidenceThreshold por encima del valor predeterminado de 0.7 es el equivalente más cercano a 'refuerzo de suma de comprobación más estricta' para simbologías con suma de comprobación opcional. Los códigos de barras que se decodifican pero caen por debajo del umbral se excluyen de los resultados, proporcionando una puerta de calidad ajustable que complementa la verificación de suma de comprobación fija.


¿Cómo utilizar la lectura de códigos de barras sensible al formato?

El enum BarcodeEncoding es un tipo de banderas: se pueden combinar múltiples formatos con el operador OR a nivel de bits. Establecer ExpectBarcodeTypes restringe al lector a esos formatos, omitiendo rutinas de detección para todos los demás.

Valores comunes de BarcodeEncoding
ValorCategoríaDescripciónSuma de comprobación
`BarcodeEncoding.All`MetaEscanear todos los formatos compatibles (por defecto)Por formato
`BarcodeEncoding.AllOneDimensional`MetaTodos los formatos lineales (1D) incluyendo apiladosPor formato
`BarcodeEncoding.AllTwoDimensional`MetaTodos los formatos de matriz/cuadrícula (2D)Por formato
`BarcodeEncoding.Code128`1DAlta densidad alfanumérica — logística, envíosObligatorio (Mod103 ponderado)
`BarcodeEncoding.EAN13`1DIdentificación de producto en retail — 13 dígitosObligatorio (Mod10)
`BarcodeEncoding.QRCode`2DMatriz de alta capacidad — URLs, datos estructuradosECC de Reed-Solomon
`BarcodeEncoding.Code39`1DAlfanumérico — defensa, automotrizOpcional (Mod43)
`BarcodeEncoding.UPCA`1DRetail norteamericano — 12 dígitosObligatorio (Mod10)
`BarcodeEncoding.DataMatrix`2DMatriz compacta — electrónica, farmacéuticaECC de Reed-Solomon
`BarcodeEncoding.PDF417`2DApilado — tarjetas de identificación, transporteECC de Reed-Solomon

Especificar el formato esperado ofrece dos beneficios: el lector omite rutinas de detección para simbologías irrelevantes (mejorando la velocidad de escaneo), y los códigos de barras de tipos inesperados se excluyen de los resultados incluso si están presentes físicamente en la imagen. Esta segunda propiedad es la validación de sensibilidad al formato: el lector devuelve solo lo que espera el pipeline.

//:path=/static-assets/barcode/content-code-examples/how-to/checksum-and-format-validation/format-constrained.cs
using IronBarCode;

// Scenario: shipping labels contain only Code128 barcodes
var constrainedOptions = new BarcodeReaderOptions
{
    ExpectBarcodeTypes = BarcodeEncoding.Code128,
    Speed = ReadingSpeed.Faster,
    ExpectMultipleBarcodes = false
};

// Scenario: auto-detect all formats (default behavior)
var broadOptions = new BarcodeReaderOptions
{
    ExpectBarcodeTypes = BarcodeEncoding.All,
    Speed = ReadingSpeed.Detailed,
    ExpectMultipleBarcodes = true
};

string imagePath = "shipping-label.png";

// Constrained read — faster, only returns Code128 results
BarcodeResults constrained = BarcodeReader.Read(imagePath, constrainedOptions);
Console.WriteLine($"Constrained: {constrained.Count} Code128 barcode(s) found");

// Broad read — slower, returns all detected formats
BarcodeResults broad = BarcodeReader.Read(imagePath, broadOptions);
Console.WriteLine($"Broad: {broad.Count} barcode(s) found across all formats");

foreach (BarcodeResult result in broad)
{
    Console.WriteLine($"  [{result.BarcodeType}] {result.Valor}");
}
//:path=/static-assets/barcode/content-code-examples/how-to/checksum-and-format-validation/format-constrained.cs
using IronBarCode;

// Scenario: shipping labels contain only Code128 barcodes
var constrainedOptions = new BarcodeReaderOptions
{
    ExpectBarcodeTypes = BarcodeEncoding.Code128,
    Speed = ReadingSpeed.Faster,
    ExpectMultipleBarcodes = false
};

// Scenario: auto-detect all formats (default behavior)
var broadOptions = new BarcodeReaderOptions
{
    ExpectBarcodeTypes = BarcodeEncoding.All,
    Speed = ReadingSpeed.Detailed,
    ExpectMultipleBarcodes = true
};

string imagePath = "shipping-label.png";

// Constrained read — faster, only returns Code128 results
BarcodeResults constrained = BarcodeReader.Read(imagePath, constrainedOptions);
Console.WriteLine($"Constrained: {constrained.Count} Code128 barcode(s) found");

// Broad read — slower, returns all detected formats
BarcodeResults broad = BarcodeReader.Read(imagePath, broadOptions);
Console.WriteLine($"Broad: {broad.Count} barcode(s) found across all formats");

foreach (BarcodeResult result in broad)
{
    Console.WriteLine($"  [{result.BarcodeType}] {result.Valor}");
}
$vbLabelText   $csharpLabel

Cuando la imagen contiene un código de barras en un formato inesperado — un código QR en una etiqueta de envío que solo debería llevar Code128 — el lector restringido devuelve cero resultados en lugar de lanzar una excepción. Esto es por diseño: la discrepancia de formato es una preocupación a nivel de datos, no una condición de error. El código de llamada debe tratar los resultados vacíos de una lectura restringida por formato como una señal de validación y registrar la discrepancia para su investigación.

Para pipelines que procesan imágenes con múltiples tipos de código de barras (por ejemplo, un albarán que contiene tanto un código de producto EAN-13 como un número de seguimiento Code128), combina los formatos esperados:

var options = new BarcodeReaderOptions
{
    ExpectBarcodeTypes = BarcodeEncoding.EAN13 | BarcodeEncoding.Code128,
    ExpectMultipleBarcodes = true
};
var options = new BarcodeReaderOptions
{
    ExpectBarcodeTypes = BarcodeEncoding.EAN13 | BarcodeEncoding.Code128,
    ExpectMultipleBarcodes = true
};
$vbLabelText   $csharpLabel

El lector encontrará y devolverá códigos de barras de ambos tipos mientras ignora cualquier otra simbología presente en la imagen. Cada BarcodeResult.BarcodeType devuelto identifica qué formato se decodificó, permitiendo la lógica de enrutamiento aguas abajo.

¿Qué simbologías soportan la validación de suma de comprobación?

No todos los formatos de código de barras utilizan sumas de comprobación de la misma forma. La siguiente tabla mapea las simbologías comunes a sus características de detección de errores, lo que informa cuán agresivamente establecer ConfidenceThreshold y RemoveFalsePositive para cada formato:

Características de suma de comprobación por simbología
SimbologíaTipo de suma de comprobación¿Obligatorio?Recomendación
EAN-13 / EAN-8Mod10Configuraciones predeterminadas suficientes: la suma de comprobación siempre se aplica
UPC-A / UPC-EMod10Configuraciones predeterminadas suficientes: corregido automáticamente durante la escritura
Code128Mod103 ponderadoConfiguraciones predeterminadas suficientes: obligatorio según especificación
Code39Mod43OpcionalElevar `ConfidenceThreshold` a 0.8+ y habilitar `RemoveFalsePositive`
CodabarMod16OpcionalIgual que Code39: usar confianza como puerta de calidad
ITFMod10OpcionalHabilitar `RemoveFalsePositive` para formatos entrelazados
QRCode / DataMatrixECC de Reed-SolomonIntegradoLa corrección de errores es estructural: no se necesita configuración adicional
PDF417ECC de Reed-SolomonIntegradoIgual que QR/DataMatrix: la corrección de errores es inherente

Para simbologías 2D (QR, DataMatrix, PDF417), la corrección de errores es parte de la estructura de codificación: estos formatos pueden recuperarse de daños parciales sin depender de un simple dígito de control. El ConfidenceThreshold todavía se aplica a la fase de detección ML, pero el paso de decodificación se beneficia de la redundancia incorporada de la simbología.


¿Cómo combinar sumas de comprobación con restricciones de formato?

El patrón listo para producción configura ExpectBarcodeTypes, RemoveFalsePositive, ConfidenceThreshold, y Speed en un solo objeto BarcodeReaderOptions. Juntas, estas propiedades forman una puerta de validación por capas: la restricción de formato reduce el espacio de búsqueda, la validación de suma de comprobación (implícita) garantiza la integridad de los datos, el umbral de confianza filtra decodificaciones marginales, y la eliminación de falsos positivos añade un pase de verificación secundaria.

//:path=/static-assets/barcode/content-code-examples/how-to/checksum-and-format-validation/combined-validation.cs
using IronBarCode;

// Production configuration: retail POS scanning with EAN-13 and UPC-A
var options = new BarcodeReaderOptions
{
    // Layer 1: Format constraint — only retail symbologies
    ExpectBarcodeTypes = BarcodeEncoding.EAN13 | BarcodeEncoding.UPCA | BarcodeEncoding.UPCE,

    // Layer 2: Confidence threshold — reject marginal decodes
    ConfidenceThreshold = 0.8,

    // Layer 3: False-positive removal — double-scan verification
    RemoveFalsePositive = true,

    // Performance tuning
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = false,
    MinScanLines = 3
};

string[] scanFiles = Directory.GetFiles("pos-scans/", "*.png");

foreach (string file in scanFiles)
{
    BarcodeResults results = BarcodeReader.Read(file, options);

    if (results.Count == 0)
    {
        // No barcode passed all validation layers
        Console.Error.WriteLine($"REJECT {Path.GetFileName(file)}: "
            + "no valid EAN-13/UPC barcode (checksum, confidence, or format mismatch)");
        continue;
    }

    BarcodeResult primary = results.First();

    // Post-read assertion: verify the decoded format matches expectations
    if (primary.BarcodeType != BarcodeEncoding.EAN13
        && primary.BarcodeType != BarcodeEncoding.UPCA
        && primary.BarcodeType != BarcodeEncoding.UPCE)
    {
        Console.Error.WriteLine($"UNEXPECTED FORMAT {Path.GetFileName(file)}: "
            + $"got {primary.BarcodeType}, expected EAN-13/UPC");
        continue;
    }

    Console.WriteLine($"OK {Path.GetFileName(file)}: "
        + $"[{primary.BarcodeType}] {primary.Valor} — {primary.Confidence}%");
}
//:path=/static-assets/barcode/content-code-examples/how-to/checksum-and-format-validation/combined-validation.cs
using IronBarCode;

// Production configuration: retail POS scanning with EAN-13 and UPC-A
var options = new BarcodeReaderOptions
{
    // Layer 1: Format constraint — only retail symbologies
    ExpectBarcodeTypes = BarcodeEncoding.EAN13 | BarcodeEncoding.UPCA | BarcodeEncoding.UPCE,

    // Layer 2: Confidence threshold — reject marginal decodes
    ConfidenceThreshold = 0.8,

    // Layer 3: False-positive removal — double-scan verification
    RemoveFalsePositive = true,

    // Performance tuning
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = false,
    MinScanLines = 3
};

string[] scanFiles = Directory.GetFiles("pos-scans/", "*.png");

foreach (string file in scanFiles)
{
    BarcodeResults results = BarcodeReader.Read(file, options);

    if (results.Count == 0)
    {
        // No barcode passed all validation layers
        Console.Error.WriteLine($"REJECT {Path.GetFileName(file)}: "
            + "no valid EAN-13/UPC barcode (checksum, confidence, or format mismatch)");
        continue;
    }

    BarcodeResult primary = results.First();

    // Post-read assertion: verify the decoded format matches expectations
    if (primary.BarcodeType != BarcodeEncoding.EAN13
        && primary.BarcodeType != BarcodeEncoding.UPCA
        && primary.BarcodeType != BarcodeEncoding.UPCE)
    {
        Console.Error.WriteLine($"UNEXPECTED FORMAT {Path.GetFileName(file)}: "
            + $"got {primary.BarcodeType}, expected EAN-13/UPC");
        continue;
    }

    Console.WriteLine($"OK {Path.GetFileName(file)}: "
        + $"[{primary.BarcodeType}] {primary.Valor} — {primary.Confidence}%");
}
$vbLabelText   $csharpLabel

La configuración MinScanLines = 3 aumenta el número mínimo de líneas de escaneo que coinciden para que un código de barras 1D sea considerado válido: el valor predeterminado es 2. Aumentar este valor reduce la probabilidad de que una línea de escaneo ruidosa produzca una lectura fantasma, a costa de perder códigos de barras delgados o parcialmente dañados. Para un entorno de POS minorista con etiquetas impresas nítidas, 3 es una elección conservadora que ajusta la puerta de validación sin afectar el rendimiento.

La afirmación BarcodeType posterior a la lectura es un patrón de defensa en profundidad. Mientras que ExpectBarcodeTypes ya restringe al lector, la verificación explícita documenta la intención y captura casos extremos en futuras versiones de la biblioteca o desviaciones de configuración. Esta afirmación no cuesta nada en tiempo de ejecución y proporciona un mensaje de diagnóstico claro cuando se viola.

Para un ajuste adicional, la propiedad Speed controla cuánto esfuerzo computacional aplica el lector. ReadingSpeed.Faster omite algunos pasos de preprocesamiento de imagen y es apropiado para etiquetas limpias impresas por máquina. ReadingSpeed.Detailed o ReadingSpeed.ExtremeDetail aplica progresivamente más filtros de imagen e intentos de rotación, lo que puede recuperar códigos de barras de imágenes dañadas o mal iluminadas a costa de tiempos de escaneo más largos.


¿Cuales son mis próximos pasos?

Este artículo cubre el modelo implícito de validación de sumas de comprobación de IronBarcode, el conjunto de banderas BarcodeEncoding para lecturas restringidas por formato, y un patrón de validación combinado utilizando ExpectBarcodeTypes, ConfidenceThreshold, RemoveFalsePositive, y MinScanLines como puertas de calidad en capas.

Para una mayor lectura, explora estos recursos:

Obtén una licencia de prueba gratuita para probar todas las funciones en un entorno en vivo, o ver opciones de licenciamiento cuando el pipeline esté listo para producción.

Preguntas Frecuentes

¿Qué es la validación de checksum de códigos de barras?

La validación de checksum de códigos de barras es un proceso que garantiza la precisión de los datos de los códigos de barras al verificar el checksum calculado contra el valor codificado dentro del código de barras. Esto ayuda a detectar errores en el proceso de escaneo.

¿Cómo maneja IronBarcode la validación de checksum?

IronBarcode maneja implícitamente la validación de checksum al calcular el checksum para los datos del código de barras y verificarlo contra el checksum codificado, asegurando la integridad de los datos durante el proceso de escaneo.

¿Qué son los filtros de BarcodeEncoding?

Los filtros de BarcodeEncoding en IronBarcode le permiten especificar qué formatos de códigos de barras leer o ignorar durante el escaneo, permitiendo un procesamiento de códigos de barras más preciso y eficiente al centrarse en tipos específicos de códigos de barras.

¿Puede IronBarcode realizar una validación combinada?

Sí, IronBarcode puede realizar una validación combinada al comprobar tanto el checksum como el formato de los códigos de barras durante el proceso de escaneo, asegurando que solo se procesen los códigos de barras válidos y correctamente formateados.

¿Es posible restringir las lecturas de códigos de barras por formato en C# con IronBarcode?

Sí, IronBarcode le permite restringir las lecturas de códigos de barras especificando los formatos que desea incluir o excluir, asegurando que su aplicación procese solo los tipos de códigos de barras relevantes.

¿Por qué es importante la lectura consciente del formato en el procesamiento de códigos de barras?

La lectura consciente del formato es importante porque permite que su aplicación procese solo tipos específicos de códigos de barras, mejorando la velocidad y precisión al ignorar formatos de códigos de barras irrelevantes o no compatibles.

¿Cómo implemento la lectura consciente del formato en IronBarcode?

Para implementar la lectura consciente del formato en IronBarcode, use los filtros de BarcodeEncoding para especificar los formatos de códigos de barras que desea leer. Esto se puede hacer a través de la API de la biblioteca, que permite un control preciso sobre los requisitos de escaneo de códigos de barras.

¿Cuáles son los beneficios de usar IronBarcode para la validación de códigos de barras?

IronBarcode ofrece varios beneficios para la validación de códigos de barras, incluida la verificación robusta de checksums, la lectura consciente del formato y la capacidad de manejar una amplia variedad de estándares de códigos de barras, asegurando alta precisión y flexibilidad en el procesamiento de códigos de barras.

Darrius Serrant
Ingeniero de Software Full Stack (WebOps)

Darrius Serrant tiene una licenciatura en Ciencias de la Computación de la Universidad de Miami y trabaja como Ingeniero de Marketing WebOps Full Stack en Iron Software. Atraído por la programación desde joven, vio la computación como algo misterioso y accesible, convirtiéndolo en el ...

Leer más
¿Listo para empezar?
Nuget Descargas 2,108,094 | Versión: 2026.3 recién lanzado
Still Scrolling Icon

¿Aún desplazándote?

¿Quieres una prueba rápida? PM > Install-Package BarCode
ejecuta una muestra observa cómo tu cadena se convierte en un código de barras.