Comment valider les checksums de codes-barres et utiliser la lecture sensible au format en C#

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

Les checksums des codes-barres existent pour détecter les erreurs de substitution - un seul chiffre transposé dans une étiquette EAN-13 peut orienter un colis vers le mauvais entrepôt. La lecture sensible au format ajoute une deuxième couche de validation : en limitant le décodeur aux symbologies attendues, on élimine les faux positifs dus au bruit de fond et on réduit le temps de numérisation en sautant les détecteurs de format non pertinents.

IronBarcode traite la vérification des checksums de manière implicite lors du décodage - l'algorithme de chiffre de contrôle de chaque symbologie est exécuté automatiquement et les codes-barres qui échouent à la vérification sont écartés avant que les résultats n'atteignent le code appelant. La propriété BarcodeReaderOptions.ExpectBarcodeTypes limite les lectures à des formats spécifiques, et RemoveFalsePositive ajoute une vérification secondaire. Cet article couvre le comportement des checksums, la lecture limitée au format et le modèle de validation combiné.

Démarrage rapide : Valider les codes-barres avec des contraintes de checksum et de format

Configurez BarcodeReaderOptions avec ExpectBarcodeTypes et RemoveFalsePositive pour limiter les lectures aux symbologies attendues avec une vérification automatique des checksums.

  1. Installez IronBarcode avec le Gestionnaire de Packages NuGet

    PM > Install-Package BarCode
  2. Copiez et exécutez cet extrait de code.

    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. Déployez pour tester sur votre environnement de production.

    Commencez à utiliser IronBarcode dans votre projet dès aujourd'hui avec un essai gratuit

    arrow pointer

Comment valider les checksums de codes-barres ?

IronBarcode valide les checksums au moment du décodage dans le cadre de la spécification de chaque symbologie. Lorsque la bibliothèque lit un code-barres EAN-13, le chiffre de contrôle Mod10 est calculé à partir des 12 premiers chiffres et comparé au 13e. Un désaccord entraîne le rejet silencieux du code-barres — il n'apparaît jamais dans la collection BarcodeResults. Le même principe s'applique à chaque format ayant un chiffre de contrôle obligatoire : UPC-A, UPC-E, EAN-8, Code128, ITF, et autres.

Ce modèle implicite diffère des bibliothèques qui exposent un basculement explicite. Le tableau ci-dessous compare les deux approches :

Comparaison des modèles de validation de checksum — IronBarcode vs. Aspose.BarCode
AspectIronBarcodeAspose.BarCode
Déclenchement de la validationAutomatique — s'exécute à chaque décodageExplicite — `ChecksumValidation.On` / `Off` / `Default`
Action requise par le développeurAucune — les codes-barres invalides sont exclus des résultatsDoit définir `BarcodeSettings.ChecksumValidation` avant de lire
Désactiver le checksum ?Non exposé — les checksums sont toujours appliqués pour les formats obligatoiresOui — `ChecksumValidation.Off` saute la vérification
Formats à checksum optionnel (Code39)Le lecteur utilise `Confidence` + `RemoveFalsePositive` pour filtrer les lectures de faible qualitéDoit être activé explicitement avec `EnableChecksum.Oui`
Comportement en cas d'échecCode-barres silencieusement omis des résultatsLe code-barres peut apparaître avec une valeur de checksum séparée pour inspection manuelle

La conséquence pratique : le code appelant qui reçoit un BarcodeResult de IronBarcode peut être sûr que le chiffre de contrôle est valide pour tout format ayant un checksum obligatoire. Il n'y a pas d'étape de configuration à oublier ni de drapeau à laisser accidentellement dans un état incorrect.

Pour les symbologies où les checksums sont optionnels — Code39 étant l'exemple principal — la bibliothèque repose sur le score de confiance et le mécanisme RemoveFalsePositive plutôt qu'un basculement explicite de checksum. La propriété Confidence sur chaque BarcodeResult indique à quel point le code-barres a été décodé de manière fiable, et le ConfidenceThreshold sur BarcodeReaderOptions (défaut 0.7) fixe le seuil de détection 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.Valeur} — 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.Valeur} — 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

Élever ConfidenceThreshold au-dessus du défaut 0.7 est l'équivalent le plus proche d'une "application stricte du checksum" pour les symbologies à checksum optionnel. Les codes-barres qui sont décodés mais en dessous du seuil sont exclus des résultats, fournissant une porte de qualité réglable qui complète la vérification fixe du checksum.


Comment utiliser la lecture de codes-barres sensible au format ?

L'énumération BarcodeEncoding est de type flags — plusieurs formats peuvent être combinés avec l'opérateur OR bit à bit. Définir ExpectBarcodeTypes restreint le lecteur à ces formats, ignorant les routines de détection pour tous les autres.

Valeurs courantes de BarcodeEncoding
ValeurCatégorieDescription du projetChecksum
`BarcodeEncoding.All`MétadonnéesScanner pour tous les formats pris en charge (par défaut)Par format
`BarcodeEncoding.AllOneDimensional`MétadonnéesTous les formats linéaires (1D) y compris empilésPar format
`BarcodeEncoding.AllTwoDimensional`MétadonnéesTous les formats matriciels/grille (2D)Par format
`BarcodeEncoding.Code128`1DAlphanumérique à haute densité — logistique, expéditionObligatoire (Mod103 pondéré)
`BarcodeEncoding.EAN13`1DIdentification de produit de vente au détail — 13 chiffresObligatoire (Mod10)
`BarcodeEncoding.QRCode`2DMatrice haute capacité — URL, données structuréesECC Reed-Solomon
`BarcodeEncoding.Code39`1DAlphanumérique — défense, automobileOptionnel (Mod43)
`BarcodeEncoding.UPCA`1DRetail nord-américain — 12 chiffresObligatoire (Mod10)
`BarcodeEncoding.DataMatrix`2DMatrice compacte — électronique, pharmaECC Reed-Solomon
`BarcodeEncoding.PDF417`2DEmpilé — cartes d'identité, transportECC Reed-Solomon

Spécifier le format attendu offre deux avantages : le lecteur saute les routines de détection pour les symbologies non pertinentes (amélioration de la vitesse de numérisation), et les codes-barres de types inattendus sont exclus des résultats même s'ils sont physiquement présents dans l'image. Cette seconde propriété est la validation de sensibilisation au format — le lecteur ne renvoie que ce que le pipeline attend.

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

Lorsque l'image contient un code-barres dans un format inattendu — un code QR sur une étiquette de livraison qui devrait seulement porter Code128 — le lecteur contraint retourne zéro résultats plutôt que de lever une exception. C'est volontaire : une incompatibilité de format est une préoccupation au niveau des données, pas une condition d'erreur. Le code appelant devrait traiter les résultats vides d'une lecture contrainte au format comme un signal de validation et enregistrer la divergence pour enquête.

Pour les pipelines traitant des images avec plusieurs types de codes-barres (par exemple, un bordereau avec à la fois un code produit EAN-13 et un numéro de suivi Code128), combinez les formats attendus :

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

Le lecteur trouvera et renverra les codes-barres des deux types tout en ignorant toute autre symbologie présente dans l'image. Chaque BarcodeResult.BarcodeType renvoyé identifie quel format a été décodé, permettant la logique de routage en aval.

Quelles symbologies prennent en charge la validation des checksums ?

Tous les formats de codes-barres n'utilisent pas les checksums de la même manière. Le tableau suivant associe des symbologies courantes à leurs caractéristiques de détection d'erreurs, qui informe de la manière dont on doit régler ConfidenceThreshold et RemoveFalsePositive pour chaque format :

Caractéristiques des checksums par symbologie
SymbologieType de checksumObligatoire ?Recommandation
EAN-13 / EAN-8Mod10OuiParamètres par défaut suffisants — checksum toujours appliqué
UPC-A / UPC-EMod10OuiParamètres par défaut suffisants — auto-corrigés lors de l'écriture
Code128Mod103 pondéréOuiParamètres par défaut suffisants — obligatoire selon la spécification
Code39Mod43OptionnelMontez `ConfidenceThreshold` à 0.8+ et activez `RemoveFalsePositive`
CodabarMod16OptionnelComme pour Code39 — utilisez la confiance comme porte de qualité
ITFMod10OptionnelActivez `RemoveFalsePositive` pour les formats entrelacés
QRCode / DataMatrixECC Reed-SolomonIntégréCorrection d'erreur structurelle — pas de configuration supplémentaire nécessaire
PDF417ECC Reed-SolomonIntégréComme QR/DataMatrix — la correction d'erreur est inhérente

Pour les symbologies 2D (QR, DataMatrix, PDF417), la correction d'erreur fait partie de la structure de codage elle-même - ces formats peuvent se remettre d'un dommage partiel sans s'appuyer sur un simple chiffre de contrôle. Le ConfidenceThreshold s'applique toujours à la phase de détection ML, mais l'étape de décodage bénéficie de la redondance intégrée de la symbologie.


Comment combiner les checksums avec les contraintes de format ?

Le modèle prêt à l'emploi configure ExpectBarcodeTypes, RemoveFalsePositive, ConfidenceThreshold, et Speed dans un seul objet BarcodeReaderOptions. Ensemble, ces propriétés forment une porte de validation en couches : la contrainte de format rétrécit l'espace de recherche, la validation des checksums (implicite) garantit l'intégrité des données, le seuil de confiance filtre les décodages marginaux, et la suppression des faux positifs ajoute un passage de vérification secondaire.

//: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.Valeur} — {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.Valeur} — {primary.Confidence}%");
}
$vbLabelText   $csharpLabel

Le paramètre MinScanLines = 3 augmente le nombre minimum de lignes de balayage concordantes pour qu'un code-barres 1D soit considéré comme valide - le défaut est 2. Augmenter cette valeur réduit la probabilité qu'une ligne de balayage bruyante produise une lecture fantôme, au prix de passer potentiellement à côté de codes-barres fins ou partiellement endommagés. Pour un environnement de point de vente de détail avec des étiquettes imprimées propres, 3 est un choix conservateur qui resserre la porte de validation sans affecter le débit.

L'assertion post-lecture BarcodeType est un modèle de défense en profondeur. Bien que ExpectBarcodeTypes contraigne déjà le lecteur, la vérification explicite documente l'intention et attrape les cas extrêmes dans les futures versions de la bibliothèque ou dérives de configuration. Cette assertion ne coûte rien à l'exécution et fournit un message diagnostique clair en cas de violation.

Pour un réglage plus poussé, la propriété Speed contrôle combien d'efforts de calcul le lecteur applique. ReadingSpeed.Faster saute certains étapes de prétraitement d'image et convient aux étiquettes imprimées à la machine propres. ReadingSpeed.Detailed ou ReadingSpeed.ExtremeDetail applique progressivement plus de filtres d'image et de tentatives de rotation, ce qui peut récupérer des codes-barres à partir d'images endommagées ou mal éclairées au prix de temps de numérisation plus longs.


Quelles sont mes prochaines étapes ?

Cet article a couvert le modèle de validation de checksum implicite de IronBarcode, l'énumération BarcodeEncoding pour des lectures contraintes au format, et un modèle de validation combiné utilisant ExpectBarcodeTypes, ConfidenceThreshold, RemoveFalsePositive, et MinScanLines comme portes de qualité superposées.

Pour approfondir la lecture, explorez ces ressources :

Obtenez une licence d'essai gratuite pour tester chaque fonctionnalité dans un environnement en direct, ou voir les options de licence lorsque le pipeline est prêt pour la production.

Questions Fréquemment Posées

Qu'est-ce que la validation de la somme de contrôle des codes-barres ?

La validation de la somme de contrôle des codes-barres est un processus qui garantit l'exactitude des données de code-barres en vérifiant la somme de contrôle calculée par rapport à la valeur encodée dans le code-barres. Cela aide à détecter les erreurs dans le processus de lecture.

Comment IronBarcode gère-t-il la validation des sommes de contrôle ?

IronBarcode gère implicitement la validation des sommes de contrôle en calculant la somme de contrôle pour les données de code-barres et en la vérifiant par rapport à la somme de contrôle encodée, assurant ainsi l'intégrité des données pendant le processus de lecture.

Qu'est-ce que les filtres BarcodeEncoding ?

Les filtres BarcodeEncoding dans IronBarcode vous permettent de spécifier quels formats de codes-barres lire ou ignorer lors de la lecture, permettant un traitement des codes-barres plus précis et efficace en se concentrant sur des types spécifiques de codes-barres.

IronBarcode peut-il effectuer une validation combinée ?

Oui, IronBarcode peut effectuer une validation combinée en vérifiant à la fois la somme de contrôle et le format des codes-barres pendant le processus de lecture, garantissant que seuls les codes-barres valides et correctement formatés sont traités.

Est-il possible de limiter les lectures de codes-barres par format en C# avec IronBarcode ?

Oui, IronBarcode vous permet de limiter les lectures de codes-barres en spécifiant les formats que vous souhaitez inclure ou exclure, garantissant que votre application ne traite que les types de codes-barres pertinents.

Pourquoi la lecture consciente du format est-elle importante dans le traitement des codes-barres ?

La lecture consciente du format est importante car elle permet à votre application de traiter uniquement des types spécifiques de codes-barres, améliorant ainsi la vitesse et la précision en ignorant les formats de codes-barres non pertinents ou non pris en charge.

Comment puis-je implémenter la lecture consciente du format dans IronBarcode ?

Pour implémenter la lecture consciente du format dans IronBarcode, utilisez des filtres BarcodeEncoding pour spécifier les formats de codes-barres que vous souhaitez lire. Cela peut être fait à travers l'API de la bibliothèque, qui permet un contrôle précis des exigences de lecture de codes-barres.

Quels sont les avantages d'utiliser IronBarcode pour la validation des codes-barres ?

IronBarcode offre plusieurs avantages pour la validation des codes-barres, y compris une vérification robuste des sommes de contrôle, une lecture consciente du format, et la capacité de gérer une large gamme de normes de codes-barres, garantissant une haute précision et flexibilité dans le traitement des codes-barres.

Darrius Serrant
Ingénieur logiciel Full Stack (WebOps)

Darrius Serrant est titulaire d'un baccalauréat en informatique de l'université de Miami et travaille comme ingénieur marketing WebOps Full Stack chez Iron Software. Attiré par le codage dès son plus jeune âge, il a vu l'informatique comme à la fois mystérieuse et accessible, en faisant le ...

Lire la suite
Prêt à commencer?
Nuget Téléchargements 2,108,094 | Version : 2026.3 vient de sortir
Still Scrolling Icon

Vous faites encore défiler ?

Vous voulez une preuve rapidement ? PM > Install-Package BarCode
exécuter un échantillon regarder votre chaîne devenir un code-barres.