Comment valider les sommes de contrôle des codes QR et appliquer la tolérance aux défauts en C

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

Les pipelines de codes QR qui traitent des entrées du monde réel, notamment des étiquettes imprimées, des captures d'écran d'appareils photo ou des documents numérisés, rencontreront des symboles trop endommagés pour être décodés et des résultats qui réussissent le calcul de la somme de contrôle mais échouent à la validation métier.

La correction d'erreurs Reed-Solomon prend automatiquement en charge les dommages physiques survenant lors du décodage. Si un symbole ne peut pas être récupéré, la collection de résultats est vide plutôt que partielle. La validation au niveau de l'application est distincte et consiste à vérifier que la valeur décodée n'est pas vide, correspond au format attendu ou contient un URI valide avant tout traitement ultérieur.

Ce guide explique comment valider les sommes de contrôle des codes QR et appliquer des contrôles de tolérance aux pannes avec la bibliothèque IronQR .

Démarrage rapide : Valider les sommes de contrôle des codes QR

Lisez un code QR et vérifiez si le décodage a réussi : un résultat non vide signifie que la somme de contrôle Reed-Solomon a été validée.

  1. Installez IronQR avec le Gestionnaire de Packages NuGet

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

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

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

    arrow pointer

Validation des sommes de contrôle des codes QR

Les codes QR utilisent la correction d'erreurs Reed-Solomon pour détecter et réparer les dommages aux données encodées. Le niveau de correction (faible à 7 %, moyen à 15 %, quartile à 25 % ou élevé à 30 %) détermine le pourcentage de mots de code qui peuvent être perdus et être récupérés.

Du côté de la lecture, la validation de la somme de contrôle s'effectue en interne lors du décodage. La classe QrResult n'expose pas de propriété de confiance ; Si un résultat existe dans la collection, la somme de contrôle a réussi. Si le décodage échoue, la collection est vide.

Entrée

Une étiquette de produit avec code QR encodant https://ironsoftware.com/, générée avec une correction d'erreurs moyenne, représentant une étiquette qui a pu être manipulée ou légèrement rayée pendant le transport.

Encodage du code QR (https://ironsoftware.com) utilisé comme entrée pour la validation de la somme de contrôle
: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

Sortie

La console affiche la valeur décodée https://ironsoftware.com/, confirmant que le décodage Reed-Solomon a réussi et que la charge utile a été récupérée intacte.

Sortie du terminal affichant le code QR décodé : https://ironsoftware.com

Pour une meilleure résistance aux dommages physiques, générez des codes QR avec un niveau de correction d'erreur plus élevé. Le niveau élevé permet de récupérer jusqu'à 30 % de pertes de données au prix d'un symbole plus grand.


Gestion de la prise en compte du format lors de la lecture des codes QR

IronQR prend en charge trois formats d'encodage QR : QR standard, Micro QR et Micro QR rectangulaire. Le scanner détecte automatiquement le format pendant la lecture. Après analyse, le champ QrResult.QrType fournit le format détecté sous forme de valeur énumérée.

Pour les fichiers PDF, utilisez QrPdfInput au lieu de QrImageInput. Le mode d'analyse détermine l'équilibre entre vitesse et précision : Auto combine la détection par apprentissage automatique avec une analyse classique, OnlyDetectionModel utilise uniquement le modèle d'apprentissage automatique pour un traitement plus rapide, et OnlyBasicScan ignore complètement l'apprentissage automatique pour des images pré-traitées de haute qualité.

Entrée

Une étiquette de produit PNG (à gauche) et une capture d'écran JPEG (à droite), démontrant la lecture prenant en compte le format sur deux types d'entrée courants.

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

Sortie

La console affiche le format détecté, la valeur décodée, l'URI résolue et le nombre de coins de l'étiquette du produit, suivis du nombre de résultats de l'analyse rapide pour la capture de la caméra.

Sortie du terminal affichant : Format : QRCode, Valeur : https://ironsoftware.com/product, URI, et Coins : 4 points détectés

Le champ QrType est utile lorsque l'application nécessite un format spécifique. Par exemple, un système d'entrepôt qui ne produit que des codes QR standard peut filtrer les détections inattendues de Micro QR ou de Micro QR rectangulaires, qui peuvent indiquer du bruit ou des étiquettes non pertinentes. Chaque format possède des caractéristiques de capacité distinctes : le QR standard prend en charge jusqu'à 7 089 caractères numériques, le Micro QR jusqu'à 35 et le Micro QR rectangulaire offre un format rectangulaire pour un espace d'étiquette limité.


Application de contrôles de valeurs nulles aux résultats des codes QR

QrReader.Read renvoie une collection vide si aucun code QR n'est trouvé ; elle ne renvoie jamais null. Toutefois, les propriétés individuelles des résultats nécessitent toujours une validation. Par exemple, Value peut être vide, et Url renvoie null si la chaîne décodée n'est pas une URI valide.

Un modèle de validation robuste vérifie trois aspects : le nombre de collections, l'intégrité des valeurs et la validité du type ou de l'URI avant de transmettre les données à un autre système.

Entrée

Une image blanche vierge sans code QR, représentant une page de document dans un lot mixte où certaines pages ne comportent aucune étiquette lisible par machine.

Image blanche vierge sans code QR utilisée comme entrée pour la démonstration de vérification de valeur nulle
: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

Sortie

La console affiche la réponse de validation vide : aucun code QR n'a été détecté, la collection est donc vide et aucune donnée n'est transmise au traitement ultérieur.

Affichage du terminal :

Le validateur renvoie une liste vide (jamais null), ce qui élimine le besoin de vérifier la valeur null au point d'appel. Le paramètre facultatif expectedFormat agit comme un filtre de format, de sorte que le code appelant ne reçoit que les résultats correspondant au type de format attendu. La propriété Url utilise l'opérateur conditionnel null pour gérer en toute sécurité les charges utiles URI et non URI.

Pour les flux de travail asynchrones, appliquez les mêmes modèles de validation à ReadAsync : attendez l'appel et utilisez des vérifications identiques sur la collection résultante.


Lecture supplémentaire

Consultez les options de licence lorsque vous serez prêt pour la production.

Cliquez ici pour télécharger le projet complet d'application console ChecksumFaultToleranceTest.

Curtis Chau
Rédacteur technique

Curtis Chau détient un baccalauréat en informatique (Université de Carleton) et se spécialise dans le développement front-end avec expertise en Node.js, TypeScript, JavaScript et React. Passionné par la création d'interfaces utilisateur intuitives et esthétiquement plaisantes, Curtis aime travailler avec des frameworks modernes ...

Lire la suite
Prêt à commencer?
Nuget Téléchargements 63,625 | Version : 2026.4 vient de sortir
Still Scrolling Icon

Vous faites encore défiler ?

Vous voulez une preuve rapidement ? PM > Install-Package IronQR
exécuter un échantillon regarder votre URL devenir un code QR.