Wie man QR-Code-Prüfsummen validiert und Fehlertoleranz in C# anwendet

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

Bei der Verarbeitung von QR-Code-Pipelines, die reale Eingaben wie gedruckte Etiketten, Kameraaufnahmen oder gescannte Dokumente verarbeiten, stoßen wir auf Symbole, die zu beschädigt sind, um dekodiert zu werden, und auf Ergebnisse, die zwar die Prüfsumme bestehen, aber die geschäftliche Validierung nicht bestehen.

Die Reed-Solomon-Fehlerkorrektur behebt automatisch physikalische Schäden während der Dekodierung. Kann ein Symbol nicht wiederhergestellt werden, ist die Ergebnismenge leer und nicht nur teilweise. Die Validierung auf Anwendungsebene ist separat und beinhaltet die Prüfung, ob der dekodierte Wert nicht leer ist, dem erwarteten Format entspricht oder eine gültige URI enthält, bevor er weiterverarbeitet wird.

Diese Anleitung erklärt, wie man mit der IronQR Bibliothek QR-Code-Prüfsummen validiert und Fehlertoleranzprüfungen durchführt.

Schnellstart: QR-Code-Prüfsummen validieren

Lesen Sie einen QR-Code und prüfen Sie, ob die Dekodierung erfolgreich war: Ein nicht leeres Ergebnis bedeutet, dass die Reed-Solomon-Prüfsumme bestanden wurde.

  1. Installieren Sie IronQR mit NuGet Package Manager

    PM > Install-Package IronQR
  2. Kopieren Sie diesen Codeausschnitt und führen Sie ihn aus.

    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. Bereitstellen zum Testen in Ihrer Live-Umgebung

    Beginnen Sie noch heute, IronQR in Ihrem Projekt zu verwenden, mit einer kostenlosen Testversion

    arrow pointer

Validierung von QR-Code-Prüfsummen

QR-Codes verwenden die Reed-Solomon-Fehlerkorrektur, um Schäden an den codierten Daten zu erkennen und zu beheben. Der Korrekturgrad (Niedrig bei 7 %, Mittel bei 15 %, Quartil bei 25 % oder Hoch bei 30 %) bestimmt den Prozentsatz der Codewörter, die verloren gehen und dennoch wiederhergestellt werden können.

Auf der Leseseite erfolgt die Prüfsummenvalidierung intern während der Dekodierung. Die Klasse QRResult stellt keine Konfidenz-Eigenschaft bereit; Wenn in der Sammlung ein Ergebnis vorhanden ist, wurde die Prüfsumme erfolgreich berechnet. Schlägt die Dekodierung fehl, ist die Sammlung leer.

Eingabe

Ein QR-Code-Produktetikett mit der Codierung https://ironsoftware.com/, generiert mit mittlerer Fehlerkorrektur, das ein Etikett darstellt, das während des Transports möglicherweise angefasst oder leicht zerkratzt wurde.

QR-Code-Codierung (https://ironsoftware.com) als Eingabe für die Prüfsummenvalidierung verwendet
: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

Ausgabe

Die Konsole zeigt den dekodierten Wert https://ironsoftware.com/ an und bestätigt damit, dass die Reed-Solomon-Dekodierung erfolgreich war und die Nutzdaten intakt wiederhergestellt wurden.

Terminalausgabe mit dem dekodierten QR-Code: https://ironsoftware.com

Um eine höhere Widerstandsfähigkeit gegenüber physischen Beschädigungen zu erzielen, sollten QR-Codes mit einem höheren Fehlerkorrekturniveau generiert werden. Die hohe Auflösung gleicht Datenverluste von bis zu 30 % aus, erfordert jedoch ein größeres Symbol.


Umgang mit Formatbewusstsein beim Lesen von QR-Codes

IronQR unterstützt drei QR-Codierungsformate: Standard-QR, Micro-QR und Rechteckiger Micro-QR. Der Scanner erkennt das Format automatisch während des Lesevorgangs. Nach dem Scannen liefert das Feld QrResult.QrType das erkannte Format als Enumerationswert.

Verwenden Sie für PDFs QrPdfInput anstelle von QrImageInput. Der Scanmodus bestimmt das Verhältnis zwischen Geschwindigkeit und Genauigkeit: Auto kombiniert maschinelles Lernen mit einer klassischen Scan-Funktion, OnlyDetectionModel verwendet nur das ML-Modell für eine schnellere Verarbeitung, und OnlyBasicScan verzichtet vollständig auf ML, um qualitativ hochwertige, vorverarbeitete Bilder zu erhalten.

Eingabe

Ein PNG-Produktetikett (links) und eine JPEG-Kameraaufnahme (rechts) demonstrieren das formatbewusste Lesen zweier gängiger Eingabetypen.

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

Ausgabe

Die Konsole zeigt das erkannte Format, den dekodierten Wert, die aufgelöste URI und die Eckpunktzahl für das Produktetikett an, gefolgt von der Anzahl der Schnellscan-Ergebnisse für die Kameraaufnahme.

Terminalausgabe mit folgenden Angaben: Format: QR-Code, Wert: https://ironsoftware.com/product, URI, Ecken: 4 erkannt

Das Feld QrType ist hilfreich, wenn die Anwendung ein bestimmtes Format erfordert. Ein Lagersystem, das beispielsweise nur Standard-QR-Codes erzeugt, kann unerwartete Micro-QR- oder Rectangular-Micro-QR-Erkennungen herausfiltern, die auf Störungen oder nicht zugehörige Etiketten hinweisen könnten. Jedes Format hat unterschiedliche Kapazitätseigenschaften: Standard-QR unterstützt bis zu 7.089 numerische Zeichen, Micro-QR bis zu 35, und Rectangular Micro QR bietet einen rechteckigen Formfaktor für begrenzten Etikettenplatz.


Anwenden von Nullprüfungen auf QR-Code-Ergebnisse

QrReader.Read gibt eine leere Sammlung zurück, wenn keine QR-Codes gefunden werden; Es wird nie null zurückgegeben. Die einzelnen Ergebniseigenschaften bedürfen jedoch noch der Validierung. Beispielsweise kann Value leer sein, und Url gibt null zurück, wenn die dekodierte Zeichenkette kein gültiger URI ist.

Ein robustes Validierungsmuster prüft drei Aspekte: die Anzahl der Datensätze, die Integrität der Werte und die Gültigkeit des Datentyps oder der URI, bevor die Daten an ein anderes System weitergegeben werden.

Eingabe

Ein leeres weißes Bild ohne QR-Code, das eine Dokumentenseite in einem gemischten Stapel darstellt, bei dem einige Seiten keine maschinenlesbare Kennzeichnung tragen.

Ein leeres weißes Bild ohne QR-Code wird als Eingabe für eine Nullprüfungsdemonstration verwendet.
: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

Ausgabe

In der Konsole wird die leere Ergebnisantwort des Validators angezeigt: Es wurden keine QR-Codes erkannt, daher ist die Sammlung leer und es werden keine Daten zur Weiterverarbeitung weitergeleitet.

Terminalausgabe mit der Meldung: Es wurden keine gültigen QR-Codes zur Verarbeitung gefunden.

Der Validator gibt eine leere Liste zurück (niemals null), wodurch die Nullprüfung beim Aufruf entfällt. Der optionale Parameter expectedFormat dient als Formatfilter, sodass der aufrufende Code nur Ergebnisse erhält, die dem erwarteten Format entsprechen. Die Url-Eigenschaft verwendet den Null-Bedingungsoperator, um sowohl URI- als auch Nicht-URI-Nutzdaten sicher zu verarbeiten.

Bei asynchronen Arbeitsabläufen sollten die gleichen Validierungsmuster auf ReadAsync angewendet werden: Warten Sie auf den Aufruf und führen Sie identische Prüfungen an der resultierenden Sammlung durch.


Weiterführende Literatur

Lizenzoptionen können Sie einsehen , sobald Sie bereit für die Produktion sind.

Klicken Sie hier, um das vollständige Konsolenanwendungsprojekt ChecksumFaultToleranceTest herunterzuladen .

Curtis Chau
Technischer Autor

Curtis Chau hat einen Bachelor-Abschluss in Informatik von der Carleton University und ist spezialisiert auf Frontend-Entwicklung mit Expertise in Node.js, TypeScript, JavaScript und React. Leidenschaftlich widmet er sich der Erstellung intuitiver und ästhetisch ansprechender Benutzerschnittstellen und arbeitet gerne mit modernen Frameworks sowie der Erstellung gut strukturierter, optisch ansprechender ...

Weiterlesen
Bereit anzufangen?
Nuget Downloads 63,625 | Version: 2026.4 gerade veröffentlicht
Still Scrolling Icon

Scrollst du immer noch?

Sie brauchen schnell einen Beweis? PM > Install-Package IronQR
Führen Sie ein Beispiel aus und beobachten Sie, wie Ihre URL zu einem QR-Code wird.