Como Validar Soma de verificaçãos de Código de Barras e Usar Leitura Compatível com Formatos em C

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

Os checksums dos códigos de barras ajudam a detectar erros de substituição. Por exemplo, um único dígito invertido em uma etiqueta EAN-13 pode enviar um pacote para o armazém errado. A leitura com reconhecimento de formato fornece uma camada adicional de validação, restringindo o decodificador às simbologias esperadas. Essa abordagem reduz os falsos positivos causados ​​por ruído de fundo e diminui o tempo de verificação, ignorando detectores de formato desnecessários.

O IronBarcode realiza a verificação de checksum automaticamente durante a decodificação. O algoritmo de dígito verificador de cada simbologia é executado por padrão, e os códigos de barras que falham são descartados antes que os resultados sejam retornados. A propriedade BarcodeReaderOptions.ExpectBarcodeTypes limita as leituras a formatos específicos, enquanto RemoveFalsePositive adiciona uma verificação secundária para leituras ambíguas.

Este guia explica como validar checksums de código de barras, restringir leituras a formatos esperados e combinar ambas as técnicas em um controle de qualidade em camadas usando BarcodeReaderOptions.

Início Rápido: Validar Códigos de Barras com Restrições de Soma de verificação e Formato

Configure BarcodeReaderOptions com ExpectBarcodeTypes e RemoveFalsePositive para restringir as leituras às simbologias esperadas com verificação automática de checksum.

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

// Format-constrained read with false-positive removal.
// Limit the decoder to EAN-13 and Code128; checksums are
// validated automatically and failures are silently discarded.
var options = new BarcodeReaderOptions
{
    ExpectBarcodeTypes  = BarcodeEncoding.EAN13 | BarcodeEncoding.Code128,
    RemoveFalsePositive = true,
    Speed               = ReadingSpeed.Balanced
};

BarcodeResults results = BarcodeReader.Read("label.png", options);
$vbLabelText   $csharpLabel

Como Validar Soma de verificaçãos de Código de Barras?

O IronBarcode valida os checksums durante a decodificação de acordo com a especificação de cada simbologia. Por exemplo, ao ler um código de barras EAN-13, o dígito verificador Mod10 é calculado a partir dos primeiros 12 dígitos e comparado ao 13º. Se os dígitos não coincidirem, o código de barras é rejeitado silenciosamente e não aparece na coleção BarcodeResults. Essa abordagem se aplica a todos os formatos com dígito verificador obrigatório, incluindo UPC-A, UPC-E, EAN-8, Código 128, ITF e outros.

Este modelo implícito difere de bibliotecas que expõem uma alternância explícita. A tabela abaixo compara as duas abordagens:

Comparação de modelos de validação de checksum: IronBarcode vs. Aspose.BarCode
AspectoIronBarcodeAspose.BarCode
Gatilho de validaçãoAutomático; executa durante cada decodificação.Explícito: Soma de verificaçãoValidation.On / Off / Default
Ação do desenvolvedor necessáriaNenhum; códigos de barras inválidos são excluídos dos resultados.Defina BarcodeSettings.Soma de verificaçãoValidation antes de ler.
Desativar soma de verificaçãoNão exposto; as somas de verificação são sempre aplicadas para formatos obrigatórios.Sim; Soma de verificaçãoValidation.Off ignora a verificação.
Formatos de checksum opcional (Código 39)Utiliza Confidence + RemoveFalsePositive para filtrar leituras de baixa qualidade.Habilite explicitamente com EnableSoma de verificação.Sim
Comportamento de falhaCódigo de barras omitido silenciosamente dos resultadosO código de barras pode apresentar um valor de checksum separado para inspeção manual.

Para simbologias com checksums opcionais, como Código 39, a biblioteca usa pontuação de confiança e RemoveFalsePositive em vez de uma opção para ativar/desativar o checksum.

Entrada

Uma etiqueta de prateleira de armazém Código 128 (caminho de sucesso) e uma imagem em branco sem código de barras (caminho de falha).

Código 128 barcode encoding RACK-A1-LOT-7382 used as the warehouse rack scan input

warehouse-rack.png (caminho de sucesso)

Blank white image with no barcode to trigger the empty result path

blank-no-barcode.png (caminho de falha — nenhum código de barras presente)

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

// Constrain reads to 1D formats and enable secondary verification.
// ConfidenceThreshold rejects decodes where the ML detector falls below 85%,
// acting as a quality gate for optional-checksum symbologies like Code39.
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)
{
    // Each result has passed checksum validation (mandatory formats)
    // and the 85% confidence threshold, so no additional filtering is needed.
    Console.WriteLine($"[{result.BarcodeType}] {result.Value}  page={result.PageNumber}");
}

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

Saída

Caminho para o Sucesso

Saída do console mostrando o código 128 RACK-A1-LOT-7382 decodificado acima do limite de confiança.

O código de barras da estante do armazém retornou como RACK-A1-LOT-7382 na página 0. Ele ultrapassou o limite de confiança de 85% e passou pela validação de checksum, então aparece em BarcodeResults.

Caminho de Falha

Saída do console mostrando o aviso: nenhum código de barras válido encontrado para a entrada de imagem em branco.

Aumentar o valor de ConfidenceThreshold acima do seu valor padrão de 0,7 torna esse controle ainda mais rigoroso para simbologias de checksum opcionais, como o Código 39.

Com a validação de checksum resolvida, o próximo passo é restringir o leitor aos formatos de código de barras que seu pipeline espera.


Como Usar a Leitura de Código de Barras Sensível ao Formato?

O enum BarcodeEncoding é um tipo de flags, permitindo que vários formatos sejam combinados usando o operador OR bit a bit. A configuração ExpectBarcodeTypes limita o leitor a esses formatos e ignora a detecção de outros.

Valores Comuns de BarcodeEncoding
ValorCategoriaDescriçãoSoma de verificação
BarcodeEncoding.AllMetaTodos os formatos suportados (comportamento padrão)Por formato
BarcodeEncoding.AllOneDimensionalMetaTodos os formatos lineares (1D), incluindo empilhadoPor formato
BarcodeEncoding.AllTwoDimensionalMetaTodos os formatos de matriz/rede (2D)Por formato
BarcodeEncoding.Código 1281DAlfanumérico de alta densidade (logística, transporte)Obrigatório (Mod103 ponderado)
BarcodeEncoding.EAN131DIdentificação de produto de varejo, 13 dígitosObrigatório (Mod10)
BarcodeEncoding.QRCode2DMatriz de alta capacidade (URLs, dados estruturados)ECC de Reed-Solomon
BarcodeEncoding.Código 391DAlfanumérico (defesa, automotivo)Opcional (Mod43)
BarcodeEncoding.UPCA1DVarejo norte-americano, 12 dígitosObrigatório (Mod10)
BarcodeEncoding.DataMatrix2DMatriz compacta (eletrônica, indústria farmacêutica)ECC de Reed-Solomon
BarcodeEncoding.PDF4172DEmpilhados (carteiras de identidade, transporte)ECC de Reed-Solomon

Além da velocidade, restringir o conjunto de formatos funciona como um mecanismo de validação: códigos de barras com qualquer simbologia não listada são excluídos dos resultados, mesmo que estejam fisicamente presentes na imagem.

Entrada

Uma etiqueta de envio Código 128 (caminho de sucesso) e um código QR que não corresponde à restrição de aceitar apenas Código 128 (caminho de falha).

Código 128 barcode encoding SHIP-2024-00438 used as the shipping label input

shipping-label.png (caminho de sucesso — Código 128 corresponde à restrição)

QR code used as the format-mismatch failure path for the Código 128-only constrained read

qr-format-mismatch.png (caminho de falha — QR rejeitado pelo filtro somente Código 128)

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

// Constrained read: only Code128 barcodes are returned.
// Faster because the reader skips all other format detectors.
var constrainedOptions = new BarcodeReaderOptions
{
    ExpectBarcodeTypes     = BarcodeEncoding.Code128,
    Speed                  = ReadingSpeed.Faster,
    ExpectMultipleBarcodes = false
};

// Broad read: all supported formats are scanned.
// Useful for verification or when the image format is unknown.
var broadOptions = new BarcodeReaderOptions
{
    ExpectBarcodeTypes     = BarcodeEncoding.All,
    Speed                  = ReadingSpeed.Detailed,
    ExpectMultipleBarcodes = true
};

string imagePath = "shipping-label.png";

BarcodeResults constrained = BarcodeReader.Read(imagePath, constrainedOptions);
Console.WriteLine($"Constrained: {constrained.Count} Code128 barcode(s) found");

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.Value}");
}
$vbLabelText   $csharpLabel

Saída

Caminho para o Sucesso

Saída do console mostrando leitura restrita encontrando 1 código de barras Código 128 e leitura ampla confirmando-o.

A etiqueta de envio tem o valor SHIP-2024-00438. A leitura restrita detecta imediatamente, já que o Código 128 é o que o filtro espera, e a leitura ampla confirma o mesmo resultado em todos os formatos.

Caminho de Falha

Saída do console mostrando leitura restrita retornando 0 resultados para uma imagem de código QR.

Resultados vazios de uma leitura restrita são um sinal de validação, não um erro; Registre a discrepância para revisão.

Para fluxos de trabalho que misturam tipos de código de barras (por exemplo, uma nota de embalagem com um código de produto EAN-13 e um número de rastreamento Código 128), combine os formatos esperados:

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

// Combine multiple format flags with | to scan for more than one symbology
// in a single pass. Each BarcodeResult.BarcodeType identifies which format
// was decoded, enabling downstream routing logic per symbology.
var options = new BarcodeReaderOptions
{
    ExpectBarcodeTypes     = BarcodeEncoding.EAN13 | BarcodeEncoding.Code128,
    ExpectMultipleBarcodes = true
};
$vbLabelText   $csharpLabel

Cada código retornado BarcodeResult.BarcodeType identifica qual formato foi decodificado, permitindo o roteamento subsequente.

Quais Simbologias Suportam Validação de Soma de verificação?

Nem todos os formatos de códigos de barras usam checksums da mesma maneira. A tabela a seguir mapeia simbologias comuns às suas características de detecção de erros, o que informa o quão agressivamente definir ConfidenceThreshold e RemoveFalsePositive para cada formato:

Características do Soma de verificação por Simbologia
SimbologiaTipo de Soma de verificaçãoObrigatório?Recomendação
EAN-13 / EAN-8Mod10SimConfigurações padrão suficientes; verificação de soma de verificação sempre aplicada.
UPC-A / UPC-EMod10SimConfigurações padrão suficientes; dígito verificador corrigido automaticamente na gravação.
Código 128Peso Mod103SimConfigurações padrão suficientes; obrigatórias conforme especificação
Código 39Mod43OpcionalAumente ConfidenceThreshold para 0.8+ e ative RemoveFalsePositive
CodabarMod16OpcionalSemelhante ao Código 39; use a confiança como critério de qualidade.
ITFMod10OpcionalAtive RemoveFalsePositive para formatos intercalados
Código QR / DataMatrixECC de Reed-SolomonSempreCorreção de erros estruturais; nenhuma configuração adicional necessária.
PDF417ECC de Reed-SolomonSempreAssim como em QR/DataMatrix, a correção de erros é inerente.

Para simbologias 2D como QR, DataMatrix e PDF417, a correção de erros está integrada na estrutura de codificação. Esses formatos podem se recuperar de danos parciais sem depender de um simples dígito verificador. O código ConfidenceThreshold ainda se aplica durante a fase de detecção de aprendizado de máquina, enquanto a etapa de decodificação se beneficia da redundância inerente à simbologia.

Agora que ambas as técnicas foram compreendidas, vamos combiná-las em um único padrão de validação pronto para produção.


Como Combinar Soma de verificaçãos com Restrições de Formato?

O padrão pronto para produção define ExpectBarcodeTypes, RemoveFalsePositive, ConfidenceThreshold e Speed em um único objeto BarcodeReaderOptions. Juntos, eles formam um mecanismo de controle em camadas: as restrições de formato restringem o espaço de busca, a validação de checksum garante a integridade dos dados, o limiar de confiança filtra decodificações marginais e a remoção de falsos positivos adiciona uma segunda etapa de verificação.

Entrada

Três códigos de barras de leitura POS do diretório pos-scans/ usados ​​como caminho de sucesso: dois EAN-13 e um UPC-A. Uma etiqueta de prateleira de armazém Código 128 é usada como caminho de falha — a restrição EAN-13/UPC-A a rejeita e registra uma linha REJECT.

EAN-13 barcode encoding 5901234123471 used as POS scan input 1

pos-scan-1.png (sucesso)

EAN-13 barcode encoding 4006381333931 used as POS scan input 2

pos-scan-2.png (sucesso)

UPC-A barcode encoding 012345678905 used as POS scan input 3

pos-scan-3.png (sucesso)

Código 128 barcode encoding RACK-A1-LOT-7382 used as the combined-validation failure path input

warehouse-rack.png (falha — Código 128 rejeitado)

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

// Layered validation for retail POS: EAN-13, UPC-A, and UPC-E only.
// Each property adds a distinct filter to the read pipeline.
var options = new BarcodeReaderOptions
{
    // Layer 1: format constraint, accept only retail symbologies
    ExpectBarcodeTypes = BarcodeEncoding.EAN13 | BarcodeEncoding.UPCA | BarcodeEncoding.UPCE,

    // Layer 2: confidence threshold, reject decodes below 80%
    ConfidenceThreshold = 0.8,

    // Layer 3: false-positive removal, runs a secondary verification pass
    RemoveFalsePositive = true,

    Speed                  = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = false,

    // Require 3 agreeing scan lines to reduce phantom reads from noisy images
    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.
    // ExpectBarcodeTypes already constrains the reader; this check documents
    // intent and surfaces unexpected results during future changes.
    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.Value}");
}
$vbLabelText   $csharpLabel

Saída

Caminho para o Sucesso

Saída do console mostrando todos os 3 códigos de barras lidos no PDV aceitos com status OK e valores decodificados.

Todas as três imagens de leitura do PDV foram aprovadas. O leitor retornou os valores 5901234123471, 4006381333931 e 012345678905. Cada um correspondia ao EAN13 | UPCA | O filtroUPCE` tinha um checksum Mod10 válido e um nível de confiança superior a 0,8.

Caminho de Falha

Saída do console mostrando o código de barras Código 128 do rack do armazém rejeitado pelo filtro EAN-13/UPC-A.

Definir MinScanLines como 3 aumenta o número mínimo de linhas de leitura coincidentes necessárias para que um código de barras 1D seja válido; O valor padrão é 2. Aumentar esse valor reduz o risco de leituras fantasmas causadas por linhas de varredura ruidosas, mas pode fazer com que códigos de barras finos ou parcialmente danificados sejam perdidos. Em ambientes de ponto de venda (PDV) com etiquetas impressas de alta qualidade, o valor 3 é uma escolha conservadora que reforça a validação sem afetar a produtividade.

A asserção pós-leitura BarcodeType é uma defesa em profundidade: ExpectBarcodeTypes já filtra, mas a verificação explícita documenta a intenção e detecta desvios de configuração sem custo de tempo de execução. Para otimização de velocidade, ReadingSpeed.Faster é adequado para rótulos limpos impressos à máquina; Os códigos Detailed e ExtremeDetail recuperam códigos de barras danificados ou mal iluminados, ao custo de tempos de leitura mais longos.


Quais são os meus próximos passos?

Este artigo abordou o modelo de validação implícita de checksum do IronBarcode, a enumeração de flags BarcodeEncoding para leituras com restrições de formato e um padrão de validação combinado usando ExpectBarcodeTypes, ConfidenceThreshold, RemoveFalsePositive e MinScanLines como portões de qualidade em camadas.

Para leitura adicional, explore estes recursos:

Obtenha uma licença de teste gratuita para testar todos os recursos em um ambiente real ou ver opções de licenciamento quando o pipeline estiver pronto para produção.

Perguntas frequentes

O que é a validação de checksum de código de barras?

A validação de checksum de código de barras é um processo que garante a precisão dos dados do código de barras verificando o checksum calculado em relação ao valor codificado dentro do código de barras. Isso ajuda na detecção de erros no processo de varredura.

Como o IronBarcode lida com a validação de checksum?

O IronBarcode lida implicitamente com a validação de checksum calculando o checksum para os dados do código de barras e verificando-o em relação ao checksum codificado, garantindo a integridade dos dados durante o processo de varredura.

O que são filtros BarcodeEncoding?

Os filtros BarcodeEncoding no IronBarcode permitem especificar quais formatos de código de barras devem ser lidos ou ignorados durante a varredura, possibilitando um processamento de códigos de barras mais preciso e eficiente ao focar em tipos de códigos de barras específicos.

O IronBarcode pode realizar validação combinada?

Sim, o IronBarcode pode realizar validação combinada verificando tanto o checksum quanto o formato dos códigos de barras durante o processo de varredura, garantindo que apenas códigos de barras válidos e com formatação correta sejam processados.

É possível restringir leituras de códigos de barras por formato em C# com IronBarcode?

Sim, o IronBarcode permite restringir leituras de códigos de barras especificando os formatos que você deseja incluir ou excluir, garantindo que sua aplicação processe apenas os tipos de código de barras relevantes.

Por que a leitura sensível ao formato é importante no processamento de código de barras?

A leitura sensível ao formato é importante porque permite que sua aplicação processe apenas tipos específicos de códigos de barras, melhorando a velocidade e precisão ao ignorar formatos de código de barras irrelevantes ou não suportados.

Como implemento a leitura sensível ao formato no IronBarcode?

Para implementar a leitura sensível ao formato no IronBarcode, use filtros de BarcodeEncoding para especificar os formatos de código de barras que deseja ler. Isso pode ser feito através da API da biblioteca, que permite um controle preciso sobre os requisitos de leitura de código de barras.

Quais são os benefícios de usar o IronBarcode para a validação de códigos de barras?

O IronBarcode oferece vários benefícios para a validação de códigos de barras, incluindo verificação robusta de checksum, leitura sensível ao formato, e a capacidade de lidar com uma ampla gama de padrões de códigos de barras, garantindo alta precisão e flexibilidade no processamento de códigos de barras.

Darrius Serrant
Engenheiro de Software Full Stack (WebOps)

Darrius Serrant é bacharel em Ciência da Computação pela Universidade de Miami e trabalha como Engenheiro de Marketing WebOps Full Stack na Iron Software. Atraído por programação desde jovem, ele via a computação como algo misterioso e acessível ao mesmo tempo, tornando-a o meio ...

Leia mais
Pronto para começar?
Nuget Downloads 2,121,847 | Versão: 2026.3 acaba de ser lançado
Still Scrolling Icon

Ainda está rolando a tela?

Quer provas rápidas? PM > Install-Package BarCode
executar um exemplo Veja seu fio se transformar em um código de barras.