# Wie man Barcode-Prüfsummen validiert und formatbewusstes Lesen in C# verwendet
Barcode-Prüfsummen helfen, Substitutionsfehler zu erkennen. Beispielsweise kann eine einzige vertauschte Ziffer in einem EAN-13-Etikett dazu führen, dass ein Paket im falschen Lager landet. Formatbewusstes Lesen bietet eine zusätzliche Validierungsebene, indem der Decoder auf erwartete Symbologien beschränkt wird. Dieser Ansatz reduziert Fehlalarme durch Hintergrundrauschen und verkürzt die Scanzeit, indem unnötige Formatdetektoren übersprungen werden.
IronBarcode führt während der Dekodierung automatisch eine Prüfsummenverifizierung durch. Der Prüfziffernalgorithmus jeder Symbologie wird standardmäßig ausgeführt, und fehlerhafte Barcodes werden verworfen, bevor Ergebnisse zurückgegeben werden. Die `BarcodeReaderOptions.ExpectBarcodeTypes` Eigenschaft beschränkt Lesungen auf spezifische Formate, während `RemoveFalsePositive` einen zweiten Scan für mehrdeutige Lesungen hinzufügt.
Dieser Leitfaden erklärt, wie Barcodesummen validiert, Lesungen auf erwartete Formate beschränkt und beide Techniken in ein gestuftes Qualitäts-Tor mit `BarcodeReaderOptions` integriert werden.
*as-heading:2(Schnellstart: Barcodes mit Prüfsummen- und Formatbeschränkungen validieren)*
Konfigurieren Sie `BarcodeReaderOptions` mit `ExpectBarcodeTypes` und `RemoveFalsePositive`, um Lesungen auf erwartete Symbologien mit automatischer Prüfziffernüberprüfung zu beschränken.
```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);
```
<div class="hsg-featured-snippet">
<h3>Minimaler Arbeitsablauf (5 Schritte)</h3>
<ol>
<li><a class="js-modal-open" data-modal-id="trial-license-after-download" href="https://nuget.org/packages/BarCode/">Laden Sie die IronBarcode Bibliothek von NuGet herunter.</a></li>
<li>Erstellen Sie eine <code>BarcodeReaderOptions</code> Instanz</li>
<li>Setzen Sie <code>ExpectBarcodeTypes</code> auf die in der Pipeline vorhandenen Symbologien.</li>
<li>Aktivieren Sie <code>RemoveFalsePositive</code> für die sekundäre Verifizierung.</li>
<li>Rufen Sie <code>BarcodeReader.Read</code> zum Dekodieren auf; Prüfsummen werden während des Dekodierungsprozesses automatisch validiert.</li>
</ol>
</div>
## Wie validiert man Barcode-Prüfsummen?
IronBarcode validiert Prüfsummen während der Dekodierung gemäß der Spezifikation jeder Symbologie. Beim Lesen eines EAN-13-Barcodes wird beispielsweise die Mod10-Prüfziffer aus den ersten 12 Ziffern berechnet und mit der 13. Ziffer verglichen. Wenn die Ziffern nicht übereinstimmen, wird der Barcode stillschweigend abgelehnt und erscheint nicht in der `BarcodeResults` Sammlung. Dieser Ansatz gilt für alle Formate mit obligatorischer Prüfziffer, einschließlich UPC-A, UPC-E, EAN-8, Code128, ITF und andere.
Dieses implizite Modell unterscheidet sich von Bibliotheken, die eine explizite Umschaltung ermöglichen. Die folgende Tabelle vergleicht die beiden Ansätze:
<div class="content__data-table" data-content-table>
<table>
<caption>Vergleich von Prüfsummenvalidierungsmodellen: IronBarcode vs. Aspose.BarCode</caption>
<thead>
<tr><th>Aspekt</th><th>IronBarcode</th><th>Aspose.BarCode</th></tr>
</thead>
<tbody>
<tr><td>Validierungsauslöser</td><td>Automatisch; wird bei jeder Dekodierung ausgeführt.</td><td>Explizit: <code>ChecksumValidation.On</code> / <code>Off</code> / <code>Default</code></td></tr>
<tr><td>Entwickleraktion erforderlich</td><td>Keine; ungültige Barcodes werden von den Ergebnissen ausgeschlossen.</td><td>Setzen Sie <code>BarcodeSettings.ChecksumValidation</code> vor dem Lesen.</td></tr>
<tr><td>Prüfsumme deaktiviert</td><td>Nicht offengelegt; Prüfsummen werden für obligatorische Formate immer erzwungen.</td><td>Ja; <code>ChecksumValidation.Off</code> überspringt die Überprüfung.</td></tr>
<tr><td>Optionale Prüfsummenformate (Code39)</td><td>Verwendet <code>Confidence</code> + <code>RemoveFalsePositive</code> , um minderwertige Lesevorgänge herauszufiltern.</td><td>Aktivieren Sie die Prüfsummeme explizit mit <code>EnableChecksum.Yes</code></td></tr>
<tr><td>Ausfallverhalten</td><td>Barcode wurde stillschweigend aus den Ergebnissen entfernt.</td><td>Der Barcode kann mit einer separaten Prüfsumme zur manuellen Überprüfung angezeigt werden.</td></tr>
</tbody>
</table>
</div>
Bei Symbologien mit optionalen Prüfziffern, wie beispielsweise Code39, verwendet die Bibliothek Vertrauensergebnisse und `RemoveFalsePositive` anstelle eines Prüfzifferschalters.
### Eingabe
Ein Code128-Lagerregaletikett (Erfolgspfad) und ein leeres Bild ohne Barcode (Fehlerpfad).
<div style="display: flex; gap: 1rem; justify-content: center; flex-wrap: wrap;">
<div class="content-img-align-center" style="width: 45%;">
<div class="center-image-wrapper">
<img src="/static-assets/barcode/how-to/checksum-and-format-validation/input-warehouse-rack.png"
alt="Code128-Barcode, der RACK-A1-LOT-7382 codiert, verwendet als Eingabe für den Lagerregal-Scan"
class="img-responsive add-shadow" />
<p style="color: #181818; font-style: italic; text-align: center;">warehouse-rack.png (Erfolgspfad)</p>
</div>
</div>
<div class="content-img-align-center" style="width: 45%;">
<div class="center-image-wrapper">
<img src="/static-assets/barcode/how-to/checksum-and-format-validation/input-blank-no-barcode.png"
alt="Leeres weißes Bild ohne Barcode, um den Pfad für leere Ergebnisse auszulösen"
class="img-responsive add-shadow" />
<p style="color: #181818; font-style: italic; text-align: center;">blank-no-barcode.png (Fehlerpfad – kein Barcode vorhanden)</p>
</div>
</div>
</div>
```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");
}
```
### Ausgabe
#### Erfolgsweg
<div class="content-img-align-center">
<div class="center-image-wrapper">
<img src="/static-assets/barcode/how-to/checksum-and-format-validation/output-checksum-validation-success.webp"
alt="Konsolenausgabe mit der Meldung, dass Code128 RACK-A1-LOT-7382 oberhalb des Konfidenzschwellenwerts dekodiert wurde."
class="img-responsive add-shadow" />
</div>
</div>
Der Barcode des Lagerregals war auf Seite 0 als `RACK-A1-LOT-7382` zurückgekommen. Er übertraf den 85%-Vertrauensschwellenwert und bestand die Prüfziffernvalidierung, sodass er in `BarcodeResults` angezeigt wird.
#### Fehlerpfad
<div class="content-img-align-center">
<div class="center-image-wrapper">
<img src="/static-assets/barcode/how-to/checksum-and-format-validation/output-checksum-validation-failure.webp"
alt="Konsolenausgabe mit der Meldung: WARNUNG: Für die Eingabe "Leeres Bild" wurden keine gültigen Barcodes gefunden."
class="img-responsive add-shadow" />
</div>
</div>
Das Anheben von `ConfidenceThreshold` über seinem Standardwert von 0,7 verschärft dieses Tor weiter für Symbologien mit optionalen Prüfziffern wie Code39.
Nachdem die Prüfsummenvalidierung abgedeckt ist, besteht der nächste Schritt darin, den Leser auf die Barcode-Formate zu beschränken, die Ihre Pipeline erwartet.
---
## Wie verwendet man formatbasiertes Barcode-Lesen?
Das `BarcodeEncoding` Enum ist ein Typ mit Flags, der es ermöglicht, mehrere Formate durch den bitweisen OR-Operator zu kombinieren. Indem Sie `ExpectBarcodeTypes` setzen, wird der Leser auf diese Formate beschränkt und die Erkennung anderer wird übersprungen.
<div class="content__data-table" data-content-table>
<table>
<caption>Gängige Barcode-Codierungswerte</caption>
<thead>
<tr><th>Wert</th><th>Kategorie</th><th>Beschreibung</th><th>Prüfsumme</th></tr>
</thead>
<tbody>
<tr><td><code>BarcodeEncoding.All</code></td><td>Meta</td><td>Alle unterstützten Formate (Standardverhalten)</td><td>Pro Format</td></tr>
<tr><td><code>BarcodeEncoding.AllOneDimensional</code></td><td>Meta</td><td>Alle linearen (1D) Formate einschließlich gestapelter</td><td>Pro Format</td></tr>
<tr><td><code>BarcodeEncoding.AllTwoDimensional</code></td><td>Meta</td><td>Alle Matrix-/Gitterformate (2D)</td><td>Pro Format</td></tr>
<tr><td><code>BarcodeEncoding.Code128</code></td><td>1D</td><td>Hochdichte alphanumerische Zeichen (Logistik, Versand)</td><td>Pflicht (gewichtetes Mod103)</td></tr>
<tr><td><code>BarcodeEncoding.EAN13</code></td><td>1D</td><td>Produktkennzeichnung im Einzelhandel, 13 Ziffern</td><td>Obligatorisch (Mod10)</td></tr>
<tr><td><code>BarcodeEncoding.QRCode</code></td><td>2D</td><td>Hochleistungsmatrix (URLs, strukturierte Daten)</td><td>Reed-Solomon-ECC</td></tr>
<tr><td><code>BarcodeEncoding.Code39</code></td><td>1D</td><td>Alphanumerisch (Verteidigung, Automobilindustrie)</td><td>Optional (Mod43)</td></tr>
<tr><td><code>BarcodeEncoding.UPCA</code></td><td>1D</td><td>Nordamerikanischer Einzelhandel, 12-stellig</td><td>Obligatorisch (Mod10)</td></tr>
<tr><td><code>BarcodeEncoding.DataMatrix</code></td><td>2D</td><td>Kompaktmatrix (Elektronik, Pharma)</td><td>Reed-Solomon-ECC</td></tr>
<tr><td><code>BarcodeEncoding.PDF417</code></td><td>2D</td><td>Gestapelt (Ausweise, Transport)</td><td>Reed-Solomon-ECC</td></tr>
</tbody>
</table>
</div>
Neben der Geschwindigkeit dient die Beschränkung des Formatsets als Validierungsgatter: Barcodes jeglicher nicht aufgeführter Symbolik werden von den Ergebnissen ausgeschlossen, selbst wenn sie physisch im Bild vorhanden sind.
### Eingabe
Ein Code128-Versandetikett (Erfolgspfad) und ein QR-Code, der nicht der Code128-Beschränkung entspricht (Fehlerpfad).
<div style="display: flex; gap: 1rem; justify-content: center; flex-wrap: wrap;">
<div class="content-img-align-center" style="width: 45%;">
<div class="center-image-wrapper">
<img src="/static-assets/barcode/how-to/checksum-and-format-validation/input-shipping-label.png"
alt="Code128-Barcode, der SHIP-2024-00438 codiert, verwendet als Eingabe für das Versandetikett"
class="img-responsive add-shadow" />
<p style="color: #181818; font-style: italic; text-align: center;">shipping-label.png (Erfolgspfad - Code128 entspricht der Bedingung)</p>
</div>
</div>
<div class="content-img-align-center" style="width: 45%;">
<div class="center-image-wrapper">
<img src="/static-assets/barcode/how-to/checksum-and-format-validation/input-qr-format-mismatch.png"
alt="QR-Code, der als Fehlerpfad bei Formatabweichung für die auf Code128 beschränkte Leseoperation verwendet wird"
class="img-responsive add-shadow" />
<p style="color: #181818; font-style: italic; text-align: center;">qr-format-mismatch.png (Fehlerpfad – QR-Code wird vom Code128-Filter abgelehnt)</p>
</div>
</div>
</div>
```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}");
}
```
### Ausgabe
#### Erfolgsweg
<div class="content-img-align-center">
<div class="center-image-wrapper">
<img src="/static-assets/barcode/how-to/checksum-and-format-validation/output-format-aware-success.webp"
alt="Konsolenausgabe mit eingeschränktem Lesevorgang, der einen Code128-Barcode findet, und breiter Lesevorgang, der dies bestätigt."
class="img-responsive add-shadow" />
</div>
</div>
Das Versandetikett hat einen Wert von `SHIP-2024-00438`. Die eingeschränkte Lesefunktion erkennt es sofort, da der Filter Code128 erwartet, und die umfassende Lesefunktion bestätigt dasselbe Ergebnis über alle Formate hinweg.
#### Fehlerpfad
<div class="content-img-align-center">
<div class="center-image-wrapper">
<img src="/static-assets/barcode/how-to/checksum-and-format-validation/output-format-aware-failure.webp"
alt="Konsolenausgabe, die anzeigt, dass ein eingeschränkter Lesevorgang für ein QR-Code-Bild 0 Ergebnisse liefert."
class="img-responsive add-shadow" />
</div>
</div>
Leere Ergebnisse bei einem eingeschränkten Lesevorgang sind ein Validierungssignal, kein Fehler; Die Abweichung zur Überprüfung protokollieren.
Bei Pipelines, die verschiedene Barcode-Typen mischen (z. B. ein Lieferschein mit EAN-13-Produktcode und Code128-Trackingnummer), kombinieren Sie die erwarteten Formate:
```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
};
```
Jeder zurückgegebene `BarcodeResult.BarcodeType` identifiziert, welches Format dekodiert wurde, was eine nachgelagerte Weiterleitung ermöglicht.
### Welche Symbologien unterstützen die Prüfsummenvalidierung?
Nicht alle Barcode-Formate verwenden Prüfsummen auf die gleiche Weise. Die folgende Tabelle ordnet gängigen Symbologien ihre Fehlererkennungsmerkmale zu, was darüber informiert, wie aggressiv `ConfidenceThreshold` und `RemoveFalsePositive` für jedes Format gesetzt werden sollten:
<div class="content__data-table" data-content-table>
<table>
<caption>Prüfsummenmerkmale nach Symbolik</caption>
<thead>
<tr><th>Symbolik</th><th>Prüfsummentyp</th><th>Obligatorisch?</th><th>Empfehlung</th></tr>
</thead>
<tbody>
<tr><td>EAN-13 / EAN-8</td><td>Mod10</td><td>Ja</td><td>Standardeinstellungen ausreichend; Prüfsumme wird immer erzwungen.</td></tr>
<tr><td>UPC-A / UPC-E</td><td>Mod10</td><td>Ja</td><td>Standardeinstellungen ausreichend; Prüfziffer wird beim Schreiben automatisch korrigiert.</td></tr>
<tr><td>Code128</td><td>Gewichtetes Mod103</td><td>Ja</td><td>Standardeinstellungen ausreichend; gemäß Spezifikation obligatorisch.</td></tr>
<tr><td>Code39</td><td>Mod43</td><td>Optional</td><td>Erhöhen Sie <code>ConfidenceThreshold</code> auf 0,8+ und aktivieren Sie <code>RemoveFalsePositive</code></td></tr>
<tr><td>Codabar</td><td>Mod16</td><td>Optional</td><td>Wie bei Code 39; Vertrauen als Qualitätskriterium verwenden.</td></tr>
<tr><td>ITF</td><td>Mod10</td><td>Optional</td><td>Aktivieren Sie <code>RemoveFalsePositive</code> für verschachtelte Formate.</td></tr>
<tr><td>QR-Code / DataMatrix</td><td>Reed-Solomon-ECC</td><td>Stets</td><td>Strukturelle Fehlerkorrektur; keine zusätzliche Konfiguration erforderlich</td></tr>
<tr><td>PDF417</td><td>Reed-Solomon-ECC</td><td>Stets</td><td>Wie bei QR/DataMatrix; Fehlerkorrektur ist inhärent.</td></tr>
</tbody>
</table>
</div>
Bei 2D-Symbologien wie QR, DataMatrix und PDF417 ist die Fehlerkorrektur in die Kodierungsstruktur integriert. Diese Formate können Teilschäden wiederherstellen, ohne auf eine einfache Prüfziffer angewiesen zu sein. Die `ConfidenceThreshold` gilt weiterhin während der ML-Erkennungsphase, während der Decodierungsschritt von der integrierten Redundanz der Symbologie profitiert.
Nachdem wir nun beide Techniken verstanden haben, kombinieren wir sie zu einem einzigen, produktionsreifen Validierungsmuster.
---
## Wie lassen sich Prüfsummen mit Formatbeschränkungen kombinieren?
Das produktionsfertige Muster setzt `ExpectBarcodeTypes`, `RemoveFalsePositive`, `ConfidenceThreshold` und `Speed` in einem einzigen `BarcodeReaderOptions`-Objekt. Zusammen bilden sie ein mehrschichtiges Kontrollsystem: Formatbeschränkungen verengen den Suchraum, die Prüfsummenvalidierung gewährleistet die Datenintegrität, die Konfidenzschwellenwertfilterung filtert Randdekodierungen und die Entfernung von Fehlalarmen fügt einen zweiten Verifizierungsdurchgang hinzu.
### Eingabe
Drei POS-Scan-Barcodes aus dem `pos-scans/` Verzeichnis wurden als Erfolgspfad verwendet: zwei EAN-13 und ein UPC-A. Ein Code128-Lagerregaletikett wurde als Fehlpfad verwendet - die EAN-13/UPC-A-Beschränkung lehnt es ab und protokolliert eine `REJECT` Zeile.
<div style="display: flex; gap: 1rem; justify-content: center; flex-wrap: wrap;">
<div class="content-img-align-center" style="width: 22%;">
<div class="center-image-wrapper">
<img src="/static-assets/barcode/how-to/checksum-and-format-validation/input-pos-scan-1.png"
alt="EAN-13 barcode encoding 5901234123471 used as POS scan input 1"
class="img-responsive add-shadow" />
<p style="color: #181818; font-style: italic; text-align: center;">pos-scan-1.png (Erfolg)</p>
</div>
</div>
<div class="content-img-align-center" style="width: 22%;">
<div class="center-image-wrapper">
<img src="/static-assets/barcode/how-to/checksum-and-format-validation/input-pos-scan-2.png"
alt="EAN-13 barcode encoding 4006381333931 used as POS scan input 2"
class="img-responsive add-shadow" />
<p style="color: #181818; font-style: italic; text-align: center;">pos-scan-2.png (Erfolg)</p>
</div>
</div>
<div class="content-img-align-center" style="width: 22%;">
<div class="center-image-wrapper">
<img src="/static-assets/barcode/how-to/checksum-and-format-validation/input-pos-scan-3.png"
alt="UPC-A barcode encoding 012345678905 used as POS scan input 3"
class="img-responsive add-shadow" />
<p style="color: #181818; font-style: italic; text-align: center;">pos-scan-3.png (Erfolg)</p>
</div>
</div>
<div class="content-img-align-center" style="width: 22%;">
<div class="center-image-wrapper">
<img src="/static-assets/barcode/how-to/checksum-and-format-validation/input-warehouse-rack.png"
alt="Code128-Barcode, der RACK-A1-LOT-7382 codiert, verwendet als Eingabe für den Fehlerpfad der kombinierten Validierung"
class="img-responsive add-shadow" />
<p style="color: #181818; font-style: italic; text-align: center;">warehouse-rack.png (Fehler – Code128 abgelehnt)</p>
</div>
</div>
</div>
```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}");
}
```
### Ausgabe
#### Erfolgsweg
<div class="content-img-align-center">
<div class="center-image-wrapper">
<img src="/static-assets/barcode/how-to/checksum-and-format-validation/output-combined-validation-success.webp"
alt="Konsolenausgabe mit Anzeige, dass alle 3 POS-Scan-Barcodes mit dem Status "OK" akzeptiert und die dekodierten Werte angezeigt werden."
class="img-responsive add-shadow" />
</div>
</div>
Alle drei POS-Scanbilder wurden erfolgreich übertragen. Der Leser hat die Werte `5901234123471`, `4006381333931` und `012345678905` zurückgegeben. Jedes einzelne entsprach dem EAN13-Code. |UPCA| Der UPCE`-Filter wies eine gültige Mod10-Prüfsumme auf, und das Konfidenzintervall lag über 0,8.
#### Fehlerpfad
<div class="content-img-align-center">
<div class="center-image-wrapper">
<img src="/static-assets/barcode/how-to/checksum-and-format-validation/output-combined-validation-failure.webp"
alt="Konsolenausgabe mit der Meldung, dass der Code128-Barcode des Lagerregals vom EAN-13/UPC-A-Filter abgelehnt wurde."
class="img-responsive add-shadow" />
</div>
</div>
Das Setzen von `MinScanLines` auf 3 erhöht die Mindestanzahl an übereinstimmenden Scanzeilen, die erforderlich sind, damit ein 1D-Barcode gültig ist; Der Standardwert ist 2. Durch Erhöhen dieses Wertes wird das Risiko von Phantom-Lesevorgängen aufgrund verrauschter Scanzeilen verringert, es kann jedoch dazu führen, dass dünne oder teilweise beschädigte Barcodes nicht erkannt werden. In Einzelhandels-POS-Umgebungen mit sauber gedruckten Etiketten ist ein Wert von 3 eine konservative Wahl, die die Validierung stärkt, ohne den Durchsatz zu beeinträchtigen.
Die nach dem Lesen erfolgende `BarcodeType`-Behauptung ist Verteidigung in der Tiefe: `ExpectBarcodeTypes` filtert bereits, aber die explizite Prüfung dokumentiert die Absicht und erfasst Konfigurationsabweichungen ohne Laufzeitkosten. Für die Geschwindigkeitsanpassung eignet sich `ReadingSpeed.Faster` für saubere maschinell gedruckte Etiketten; `Detailed` und `ExtremeDetail` stellen beschädigte oder schlecht beleuchtete Barcodes wieder her, auf Kosten längerer Scanzeiten.
---
## Was sind meine nächsten Schritte?
Dieser Artikel behandelte das implizite Prüfziffer-Validierungsmodell von IronBarcode, das `BarcodeEncoding` Flags-Enum für formatbeschränkte Lesungen und ein kombiniertes Validierungsmuster mit `ExpectBarcodeTypes`, `ConfidenceThreshold`, `RemoveFalsePositive` und `MinScanLines` als gestufte Qualitäts-Tore.
Für weiterführende Informationen konsultieren Sie bitte diese Ressourcen:
- [IronBarcode Tutorials - Barcodes lesen:](https://ironsoftware.com/csharp/barcode/tutorials/reading-barcodes/) Schritt-für-Schritt-Anleitungen zum Lesen von Barcodes.
- [Verhindern von Falschpositiven](https://ironsoftware.com/csharp/barcode/troubleshooting/false-positives/) für den `RemoveFalsePositive`-Mechanismus im Detail.
- [Beispiele für Konfidenzschwellenwerte](https://ironsoftware.com/csharp/barcode/examples/confidence-threshold/) zur Optimierung der ML-basierten Erkennung.
- [Ausgabe-Datenformate](https://ironsoftware.com/csharp/barcode/how-to/output-data-formats/) für die Referenz zur `BarcodeResult` Eigenschaft.
- [Bildkorrektur-Anleitung](https://ironsoftware.com/csharp/barcode/how-to/image-correction/) für Filter zur Verbesserung der Dekodierungsgenauigkeit.
- Die vollständige Konfigurationsdokumentation finden Sie in [der BarcodeReaderOptions API-Referenz](https://ironsoftware.com/csharp/barcode/object-reference/api/IronBarCode.BarcodeReaderOptions.html) .
- Die vollständige Liste der unterstützten Symbologien finden Sie in [der BarcodeEncoding API-Referenz](https://ironsoftware.com/csharp/barcode/object-reference/api/IronBarCode.BarcodeEncoding.html) .
[Sichern Sie sich eine kostenlose Testlizenz,](https://ironsoftware.com/csharp/barcode/#trial-license) um alle Funktionen in einer Live-Umgebung zu testen, oder [informieren Sie sich über die Lizenzoptionen,](https://ironsoftware.com/csharp/barcode/licensing/) sobald die Pipeline produktionsbereit ist.
Barcode-Prüfsummen helfen, Substitutionsfehler zu erkennen. Beispielsweise kann eine einzige vertauschte Ziffer in einem EAN-13-Etikett dazu führen, dass ein Paket im falschen Lager landet. Formatbewusstes Lesen bietet eine zusätzliche Validierungsebene, indem der Decoder auf erwartete Symbologien beschränkt wird. Dieser Ansatz reduziert Fehlalarme durch Hintergrundrauschen und verkürzt die Scanzeit, indem unnötige Formatdetektoren übersprungen werden.
IronBarcode führt während der Dekodierung automatisch eine Prüfsummenverifizierung durch. Der Prüfziffernalgorithmus jeder Symbologie wird standardmäßig ausgeführt, und fehlerhafte Barcodes werden verworfen, bevor Ergebnisse zurückgegeben werden. Die BarcodeReaderOptions.ExpectBarcodeTypes Eigenschaft beschränkt Lesungen auf spezifische Formate, während RemoveFalsePositive einen zweiten Scan für mehrdeutige Lesungen hinzufügt.
Dieser Leitfaden erklärt, wie Barcodesummen validiert, Lesungen auf erwartete Formate beschränkt und beide Techniken in ein gestuftes Qualitäts-Tor mit BarcodeReaderOptions integriert werden.
Schnellstart: Barcodes mit Prüfsummen- und Formatbeschränkungen validieren
Konfigurieren Sie BarcodeReaderOptions mit ExpectBarcodeTypes und RemoveFalsePositive, um Lesungen auf erwartete Symbologien mit automatischer Prüfziffernüberprüfung zu beschränken.
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);
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);
ImportsIronBarCode' Format-constrained read with false-positive removal.' Limit the decoder to EAN-13 and Code128; checksums are' validated automatically and failures are silently discarded.Dim options As New BarcodeReaderOptionsWith { .ExpectBarcodeTypes = BarcodeEncoding.EAN13OrBarcodeEncoding.Code128, .RemoveFalsePositive = True, .Speed = ReadingSpeed.Balanced}Dim results AsBarcodeResults = BarcodeReader.Read("label.png", options)
Imports 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.
Dim options As New BarcodeReaderOptions With {
.ExpectBarcodeTypes = BarcodeEncoding.EAN13 Or BarcodeEncoding.Code128,
.RemoveFalsePositive = True,
.Speed = ReadingSpeed.Balanced
}
Dim results As BarcodeResults = BarcodeReader.Read("label.png", options)
Setzen Sie ExpectBarcodeTypes auf die in der Pipeline vorhandenen Symbologien.
Aktivieren Sie RemoveFalsePositive für die sekundäre Verifizierung.
Rufen Sie BarcodeReader.Read zum Dekodieren auf; Prüfsummen werden während des Dekodierungsprozesses automatisch validiert.
Wie validiert man Barcode-Prüfsummen?
IronBarcode validiert Prüfsummen während der Dekodierung gemäß der Spezifikation jeder Symbologie. Beim Lesen eines EAN-13-Barcodes wird beispielsweise die Mod10-Prüfziffer aus den ersten 12 Ziffern berechnet und mit der 13. Ziffer verglichen. Wenn die Ziffern nicht übereinstimmen, wird der Barcode stillschweigend abgelehnt und erscheint nicht in der BarcodeResults Sammlung. Dieser Ansatz gilt für alle Formate mit obligatorischer Prüfziffer, einschließlich UPC-A, UPC-E, EAN-8, Code128, ITF und andere.
Dieses implizite Modell unterscheidet sich von Bibliotheken, die eine explizite Umschaltung ermöglichen. Die folgende Tabelle vergleicht die beiden Ansätze:
Vergleich von Prüfsummenvalidierungsmodellen: IronBarcode vs. Aspose.BarCode
Aspekt
IronBarcode
Aspose.BarCode
Validierungsauslöser
Automatisch; wird bei jeder Dekodierung ausgeführt.
Explizit: ChecksumValidation.On / Off / Default
Entwickleraktion erforderlich
Keine; ungültige Barcodes werden von den Ergebnissen ausgeschlossen.
Setzen Sie BarcodeSettings.ChecksumValidation vor dem Lesen.
Prüfsumme deaktiviert
Nicht offengelegt; Prüfsummen werden für obligatorische Formate immer erzwungen.
Ja; ChecksumValidation.Off überspringt die Überprüfung.
Optionale Prüfsummenformate (Code39)
Verwendet Confidence + RemoveFalsePositive , um minderwertige Lesevorgänge herauszufiltern.
Aktivieren Sie die Prüfsummeme explizit mit EnableChecksum.Yes
Ausfallverhalten
Barcode wurde stillschweigend aus den Ergebnissen entfernt.
Der Barcode kann mit einer separaten Prüfsumme zur manuellen Überprüfung angezeigt werden.
Bei Symbologien mit optionalen Prüfziffern, wie beispielsweise Code39, verwendet die Bibliothek Vertrauensergebnisse und RemoveFalsePositive anstelle eines Prüfzifferschalters.
Eingabe
Ein Code128-Lagerregaletikett (Erfolgspfad) und ein leeres Bild ohne Barcode (Fehlerpfad).
warehouse-rack.png (Erfolgspfad)
blank-no-barcode.png (Fehlerpfad – kein Barcode vorhanden)
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");}
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");
}
ImportsIronBarCode' 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.Dim options As New BarcodeReaderOptionsWith { .ExpectBarcodeTypes = BarcodeEncoding.AllOneDimensional, .RemoveFalsePositive = True, .ConfidenceThreshold = 0.85, .Speed = ReadingSpeed.Detailed}Dim results AsBarcodeResults = BarcodeReader.Read("warehouse-rack.png", options)For Each result AsBarcodeResultIn 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}")NextIf results.Count = 0 ThenConsole.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")End If
Imports 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.
Dim options As New BarcodeReaderOptions With {
.ExpectBarcodeTypes = BarcodeEncoding.AllOneDimensional,
.RemoveFalsePositive = True,
.ConfidenceThreshold = 0.85,
.Speed = ReadingSpeed.Detailed
}
Dim results As BarcodeResults = BarcodeReader.Read("warehouse-rack.png", options)
For Each result As BarcodeResult 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}")
Next
If results.Count = 0 Then
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")
End If
Ausgabe
Erfolgsweg
Der Barcode des Lagerregals war auf Seite 0 als RACK-A1-LOT-7382 zurückgekommen. Er übertraf den 85%-Vertrauensschwellenwert und bestand die Prüfziffernvalidierung, sodass er in BarcodeResults angezeigt wird.
Fehlerpfad
Das Anheben von ConfidenceThreshold über seinem Standardwert von 0,7 verschärft dieses Tor weiter für Symbologien mit optionalen Prüfziffern wie Code39.
Nachdem die Prüfsummenvalidierung abgedeckt ist, besteht der nächste Schritt darin, den Leser auf die Barcode-Formate zu beschränken, die Ihre Pipeline erwartet.
Wie verwendet man formatbasiertes Barcode-Lesen?
Das BarcodeEncoding Enum ist ein Typ mit Flags, der es ermöglicht, mehrere Formate durch den bitweisen OR-Operator zu kombinieren. Indem Sie ExpectBarcodeTypes setzen, wird der Leser auf diese Formate beschränkt und die Erkennung anderer wird übersprungen.
Gängige Barcode-Codierungswerte
Wert
Kategorie
Beschreibung
Prüfsumme
BarcodeEncoding.All
Meta
Alle unterstützten Formate (Standardverhalten)
Pro Format
BarcodeEncoding.AllOneDimensional
Meta
Alle linearen (1D) Formate einschließlich gestapelter
Neben der Geschwindigkeit dient die Beschränkung des Formatsets als Validierungsgatter: Barcodes jeglicher nicht aufgeführter Symbolik werden von den Ergebnissen ausgeschlossen, selbst wenn sie physisch im Bild vorhanden sind.
Eingabe
Ein Code128-Versandetikett (Erfolgspfad) und ein QR-Code, der nicht der Code128-Beschränkung entspricht (Fehlerpfad).
shipping-label.png (Erfolgspfad - Code128 entspricht der Bedingung)
qr-format-mismatch.png (Fehlerpfad – QR-Code wird vom Code128-Filter abgelehnt)
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}");}
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}");
}
ImportsIronBarCode' Constrained read: only Code128 barcodes are returned.' Faster because the reader skips all other format detectors.Dim constrainedOptions As New BarcodeReaderOptionsWith { .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.Dim broadOptions As New BarcodeReaderOptionsWith { .ExpectBarcodeTypes = BarcodeEncoding.All, .Speed = ReadingSpeed.Detailed, .ExpectMultipleBarcodes = True}Dim imagePath AsString = "shipping-label.png"Dim constrained AsBarcodeResults = BarcodeReader.Read(imagePath, constrainedOptions)Console.WriteLine($"Constrained: {constrained.Count} Code128 barcode(s) found")Dim broad AsBarcodeResults = BarcodeReader.Read(imagePath, broadOptions)Console.WriteLine($"Broad: {broad.Count} barcode(s) found across all formats")For Each result AsBarcodeResultIn broadConsole.WriteLine($" [{result.BarcodeType}] {result.Value}")Next
Imports IronBarCode
' Constrained read: only Code128 barcodes are returned.
' Faster because the reader skips all other format detectors.
Dim constrainedOptions As New BarcodeReaderOptions With {
.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.
Dim broadOptions As New BarcodeReaderOptions With {
.ExpectBarcodeTypes = BarcodeEncoding.All,
.Speed = ReadingSpeed.Detailed,
.ExpectMultipleBarcodes = True
}
Dim imagePath As String = "shipping-label.png"
Dim constrained As BarcodeResults = BarcodeReader.Read(imagePath, constrainedOptions)
Console.WriteLine($"Constrained: {constrained.Count} Code128 barcode(s) found")
Dim broad As BarcodeResults = BarcodeReader.Read(imagePath, broadOptions)
Console.WriteLine($"Broad: {broad.Count} barcode(s) found across all formats")
For Each result As BarcodeResult In broad
Console.WriteLine($" [{result.BarcodeType}] {result.Value}")
Next
Ausgabe
Erfolgsweg
Das Versandetikett hat einen Wert von SHIP-2024-00438. Die eingeschränkte Lesefunktion erkennt es sofort, da der Filter Code128 erwartet, und die umfassende Lesefunktion bestätigt dasselbe Ergebnis über alle Formate hinweg.
Fehlerpfad
Leere Ergebnisse bei einem eingeschränkten Lesevorgang sind ein Validierungssignal, kein Fehler; Die Abweichung zur Überprüfung protokollieren.
Bei Pipelines, die verschiedene Barcode-Typen mischen (z. B. ein Lieferschein mit EAN-13-Produktcode und Code128-Trackingnummer), kombinieren Sie die erwarteten Formate:
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};
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
};
ImportsIronBarCode' Combine multiple format flags with Or 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.Dim options As New BarcodeReaderOptionsWith { .ExpectBarcodeTypes = BarcodeEncoding.EAN13OrBarcodeEncoding.Code128, .ExpectMultipleBarcodes = True}
Imports IronBarCode
' Combine multiple format flags with Or 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.
Dim options As New BarcodeReaderOptions With {
.ExpectBarcodeTypes = BarcodeEncoding.EAN13 Or BarcodeEncoding.Code128,
.ExpectMultipleBarcodes = True
}
Jeder zurückgegebene BarcodeResult.BarcodeType identifiziert, welches Format dekodiert wurde, was eine nachgelagerte Weiterleitung ermöglicht.
Welche Symbologien unterstützen die Prüfsummenvalidierung?
Nicht alle Barcode-Formate verwenden Prüfsummen auf die gleiche Weise. Die folgende Tabelle ordnet gängigen Symbologien ihre Fehlererkennungsmerkmale zu, was darüber informiert, wie aggressiv ConfidenceThreshold und RemoveFalsePositive für jedes Format gesetzt werden sollten:
Prüfsummenmerkmale nach Symbolik
Symbolik
Prüfsummentyp
Obligatorisch?
Empfehlung
EAN-13 / EAN-8
Mod10
Ja
Standardeinstellungen ausreichend; Prüfsumme wird immer erzwungen.
UPC-A / UPC-E
Mod10
Ja
Standardeinstellungen ausreichend; Prüfziffer wird beim Schreiben automatisch korrigiert.
Erhöhen Sie ConfidenceThreshold auf 0,8+ und aktivieren Sie RemoveFalsePositive
Codabar
Mod16
Optional
Wie bei Code 39; Vertrauen als Qualitätskriterium verwenden.
ITF
Mod10
Optional
Aktivieren Sie RemoveFalsePositive für verschachtelte Formate.
QR-Code / DataMatrix
Reed-Solomon-ECC
Stets
Strukturelle Fehlerkorrektur; keine zusätzliche Konfiguration erforderlich
PDF417
Reed-Solomon-ECC
Stets
Wie bei QR/DataMatrix; Fehlerkorrektur ist inhärent.
Bei 2D-Symbologien wie QR, DataMatrix und PDF417 ist die Fehlerkorrektur in die Kodierungsstruktur integriert. Diese Formate können Teilschäden wiederherstellen, ohne auf eine einfache Prüfziffer angewiesen zu sein. Die ConfidenceThreshold gilt weiterhin während der ML-Erkennungsphase, während der Decodierungsschritt von der integrierten Redundanz der Symbologie profitiert.
Nachdem wir nun beide Techniken verstanden haben, kombinieren wir sie zu einem einzigen, produktionsreifen Validierungsmuster.
Wie lassen sich Prüfsummen mit Formatbeschränkungen kombinieren?
Das produktionsfertige Muster setzt ExpectBarcodeTypes, RemoveFalsePositive, ConfidenceThreshold und Speed in einem einzigen BarcodeReaderOptions-Objekt. Zusammen bilden sie ein mehrschichtiges Kontrollsystem: Formatbeschränkungen verengen den Suchraum, die Prüfsummenvalidierung gewährleistet die Datenintegrität, die Konfidenzschwellenwertfilterung filtert Randdekodierungen und die Entfernung von Fehlalarmen fügt einen zweiten Verifizierungsdurchgang hinzu.
Eingabe
Drei POS-Scan-Barcodes aus dem pos-scans/ Verzeichnis wurden als Erfolgspfad verwendet: zwei EAN-13 und ein UPC-A. Ein Code128-Lagerregaletikett wurde als Fehlpfad verwendet - die EAN-13/UPC-A-Beschränkung lehnt es ab und protokolliert eine REJECT Zeile.
pos-scan-1.png (Erfolg)
pos-scan-2.png (Erfolg)
pos-scan-3.png (Erfolg)
warehouse-rack.png (Fehler – Code128 abgelehnt)
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 symbologiesExpectBarcodeTypes = 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 passRemoveFalsePositive = true,Speed = ReadingSpeed.Balanced,ExpectMultipleBarcodes = false, // Require 3 agreeing scan lines to reduce phantom reads from noisy imagesMinScanLines = 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 layersConsole.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}");}
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}");
}
ImportsIronBarCodeImportsSystem.IO' Layered validation for retail POS: EAN-13, UPC-A, and UPC-E only.' Each property adds a distinct filter to the read pipeline.Dim options As New BarcodeReaderOptionsWith { ' Layer 1: format constraint, accept only retail symbologies .ExpectBarcodeTypes = BarcodeEncoding.EAN13OrBarcodeEncoding.UPCAOrBarcodeEncoding.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}Dim scanFiles AsString() = Directory.GetFiles("pos-scans/", "*.png")For Each file AsStringIn scanFiles Dim results AsBarcodeResults = BarcodeReader.Read(file, options) If results.Count = 0 Then ' No barcode passed all validation layersConsole.Error.WriteLine($"REJECT {Path.GetFileName(file)}: " & "no valid EAN-13/UPC barcode (checksum, confidence, or format mismatch)") Continue For End If Dim primary AsBarcodeResult = 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.EAN13AndAlso primary.BarcodeType <> BarcodeEncoding.UPCAAndAlso primary.BarcodeType <> BarcodeEncoding.UPCEThenConsole.Error.WriteLine($"UNEXPECTED FORMAT {Path.GetFileName(file)}: " & $"got {primary.BarcodeType}, expected EAN-13/UPC") Continue For End IfConsole.WriteLine($"OK {Path.GetFileName(file)}: [{primary.BarcodeType}] {primary.Value}")Next
Imports IronBarCode
Imports System.IO
' Layered validation for retail POS: EAN-13, UPC-A, and UPC-E only.
' Each property adds a distinct filter to the read pipeline.
Dim options As New BarcodeReaderOptions With {
' Layer 1: format constraint, accept only retail symbologies
.ExpectBarcodeTypes = BarcodeEncoding.EAN13 Or BarcodeEncoding.UPCA Or 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
}
Dim scanFiles As String() = Directory.GetFiles("pos-scans/", "*.png")
For Each file As String In scanFiles
Dim results As BarcodeResults = BarcodeReader.Read(file, options)
If results.Count = 0 Then
' 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 For
End If
Dim primary As BarcodeResult = 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 AndAlso
primary.BarcodeType <> BarcodeEncoding.UPCA AndAlso
primary.BarcodeType <> BarcodeEncoding.UPCE Then
Console.Error.WriteLine($"UNEXPECTED FORMAT {Path.GetFileName(file)}: " &
$"got {primary.BarcodeType}, expected EAN-13/UPC")
Continue For
End If
Console.WriteLine($"OK {Path.GetFileName(file)}: [{primary.BarcodeType}] {primary.Value}")
Next
Ausgabe
Erfolgsweg
Alle drei POS-Scanbilder wurden erfolgreich übertragen. Der Leser hat die Werte 5901234123471, 4006381333931 und 012345678905 zurückgegeben. Jedes einzelne entsprach dem EAN13-Code. |UPCA| Der UPCE`-Filter wies eine gültige Mod10-Prüfsumme auf, und das Konfidenzintervall lag über 0,8.
Fehlerpfad
Das Setzen von MinScanLines auf 3 erhöht die Mindestanzahl an übereinstimmenden Scanzeilen, die erforderlich sind, damit ein 1D-Barcode gültig ist; Der Standardwert ist 2. Durch Erhöhen dieses Wertes wird das Risiko von Phantom-Lesevorgängen aufgrund verrauschter Scanzeilen verringert, es kann jedoch dazu führen, dass dünne oder teilweise beschädigte Barcodes nicht erkannt werden. In Einzelhandels-POS-Umgebungen mit sauber gedruckten Etiketten ist ein Wert von 3 eine konservative Wahl, die die Validierung stärkt, ohne den Durchsatz zu beeinträchtigen.
Die nach dem Lesen erfolgende BarcodeType-Behauptung ist Verteidigung in der Tiefe: ExpectBarcodeTypes filtert bereits, aber die explizite Prüfung dokumentiert die Absicht und erfasst Konfigurationsabweichungen ohne Laufzeitkosten. Für die Geschwindigkeitsanpassung eignet sich ReadingSpeed.Faster für saubere maschinell gedruckte Etiketten; Detailed und ExtremeDetail stellen beschädigte oder schlecht beleuchtete Barcodes wieder her, auf Kosten längerer Scanzeiten.
Was sind meine nächsten Schritte?
Dieser Artikel behandelte das implizite Prüfziffer-Validierungsmodell von IronBarcode, das BarcodeEncoding Flags-Enum für formatbeschränkte Lesungen und ein kombiniertes Validierungsmuster mit ExpectBarcodeTypes, ConfidenceThreshold, RemoveFalsePositive und MinScanLines als gestufte Qualitäts-Tore.
Für weiterführende Informationen konsultieren Sie bitte diese Ressourcen:
Die Prüfsummenvalidierung von Barcodes ist ein Verfahren, das die Genauigkeit der Barcode-Daten sicherstellt, indem die berechnete Prüfsumme mit dem im Barcode kodierten Wert verglichen wird. Dies hilft, Fehler beim Scannen zu erkennen.
Wie handhabt IronBarcode die Prüfsummenvalidierung?
IronBarcode übernimmt die Prüfsummenvalidierung implizit, indem es die Prüfsumme für die Barcodedaten berechnet und sie mit der codierten Prüfsumme vergleicht. Dadurch wird die Datenintegrität während des Scanvorgangs sichergestellt.
Was sind BarcodeEncoding-Filter?
Mit den BarcodeEncoding-Filtern in IronBarcode können Sie festlegen, welche Barcode-Formate beim Scannen gelesen oder ignoriert werden sollen. Dies ermöglicht eine genauere und effizientere Barcode-Verarbeitung, indem der Fokus auf bestimmte Barcode-Typen gelegt wird.
Kann IronBarcode eine kombinierte Validierung durchführen?
Ja, IronBarcode kann eine kombinierte Validierung durchführen, indem es während des Scanvorgangs sowohl die Prüfsumme als auch das Format der Barcodes überprüft und so sicherstellt, dass nur gültige und korrekt formatierte Barcodes verarbeitet werden.
Ist es mit IronBarcode in C# möglich, Barcode-Lesevorgänge nach Format einzuschränken?
Ja, IronBarcode ermöglicht es Ihnen, Barcode-Lesevorgänge einzuschränken, indem Sie die Formate angeben, die ein- oder ausgeschlossen werden sollen, und so sicherzustellen, dass Ihre Anwendung nur relevante Barcode-Typen verarbeitet.
Warum ist formatbewusstes Lesen bei der Barcode-Verarbeitung wichtig?
Formatbewusstes Lesen ist wichtig, weil es Ihrer Anwendung ermöglicht, nur bestimmte Barcode-Typen zu verarbeiten, wodurch Geschwindigkeit und Genauigkeit verbessert werden, indem irrelevante oder nicht unterstützte Barcode-Formate ignoriert werden.
Wie implementiere ich formatbewusstes Lesen in IronBarcode?
Um formatabhängiges Lesen in IronBarcode zu implementieren, verwenden Sie BarcodeEncoding-Filter, um die zu lesenden Barcode-Formate festzulegen. Dies erfolgt über die API der Bibliothek, die eine präzise Steuerung der Anforderungen an das Barcode-Scannen ermöglicht.
Welche Vorteile bietet die Verwendung von IronBarcode zur Barcode-Validierung?
IronBarcode bietet zahlreiche Vorteile für die Barcode-Validierung, darunter eine robuste Prüfsummenverifizierung, formatbewusstes Lesen und die Fähigkeit, eine breite Palette von Barcode-Standards zu verarbeiten, wodurch eine hohe Genauigkeit und Flexibilität bei der Barcode-Verarbeitung gewährleistet wird.
What does the ConfidenceThreshold property do in IronBarcode?
The `ConfidenceThreshold` property in IronBarcode sets a quality gate for decoding, rejecting barcodes where the machine learning detector's confidence falls below a specified percentage.
How can IronBarcode combine checksum validation with format constraints?
IronBarcode combines checksum validation with format constraints using `BarcodeReaderOptions`. By setting properties like `ExpectBarcodeTypes`, `ConfidenceThreshold`, and `RemoveFalsePositive`, it creates a layered validation approach.
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 Handbücher.