# Jak weryfikować sumy kontrolne BarCode'ów i korzystać z odczytu z uwzględnieniem formatu w języku C#
Sumy kontrolne BarCode pomagają wykrywać błędy zastąpienia. Na przykład jedna zamieniona cyfra w etykiecie EAN-13 może spowodować wysłanie paczki do niewłaściwego magazynu. Odczyt uwzględniający format zapewnia dodatkową warstwę walidacji poprzez ograniczenie dekodera do oczekiwanych symboli. Takie podejście ogranicza liczbę fałszywych alarmów spowodowanych szumem tła i skraca czas skanowania poprzez pomijanie zbędnych detektorów formatów.
IronBarCode automatycznie weryfikuje sumę kontrolną podczas dekodowania. Algorytm cyfr kontrolnych każdej symboliki działa domyślnie, a BARCODES, które nie przejdą weryfikacji, są odrzucane przed zwróceniem wyników. Właściwość `BarcodeReaderOptions.ExpectBarcodeTypes` ogranicza odczyty do określonych formatów, podczas gdy `RemoveFalsePositive` dodaje sekundarny skan dla jednoznacznych odczytów.
Ten przewodnik wyjaśnia, jak walidować sumy kontrolne kodów kreskowych, ograniczać odczyty do oczekiwanych formatów i łączyć obie techniki w wielowarstwową bramę jakości z użyciem `BarcodeReaderOptions`.
*as-heading:2(Szybki start: Sprawdzanie poprawności BarCodes za pomocą sum kontrolnych i ograniczeń formatowych)*
Skonfiguruj `BarcodeReaderOptions` z `ExpectBarcodeTypes` i `RemoveFalsePositive`, aby ograniczyć odczyty do oczekiwanych symbologii z automatyczną weryfikacją sumy kontrolnej.
```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>Minimalny proces (5 kroków)</h3>
<ol>
<li><a class="js-modal-open" data-modal-id="trial-license-after-download" href="https://nuget.org/packages/BarCode/">Pobierz bibliotekę IronBarCode z NuGet</a></li>
<li>Utwórz instancję <code>BarcodeReaderOptions</code></li>
<li>Ustaw <code>ExpectBarcodeTypes</code> na symbole obecne w potoku</li>
<li>Włącz <code>opcję RemoveFalsePositive</code> w celu dodatkowej weryfikacji</li>
<li>Wywołaj <code>BarcodeReader.Read</code> w celu dekodowania; sumy kontrolne są weryfikowane automatycznie podczas dekodowania</li>
</ol>
</div>
## Jak zweryfikować sumy kontrolne BarCode'ów?
IronBarCode weryfikuje sumy kontrolne podczas dekodowania zgodnie ze specyfikacją danej symboliki. Na przykład podczas odczytu barcodu EAN-13 cyfra kontrolna Mod10 jest obliczana na podstawie pierwszych 12 cyfr i porównywana z 13. Jeśli cyfry nie pasują, kod kreskowy jest cicho odrzucany i nie pojawia się w kolekcji `BarcodeResults`. Podejście to ma zastosowanie do wszystkich formatów z obowiązkową cyfrą kontrolną, w tym UPC-A, UPC-E, EAN-8, Code128, ITF i innych.
Ten model domyślny różni się od bibliotek, które udostępniają wyraźny przełącznik. Poniższa tabela przedstawia porównanie tych dwóch podejść:
<div class="content__data-table" data-content-table>
<table>
<caption>Porównanie modeli weryfikacji sum kontrolnych: IronBarCode vs. Aspose.BarCode</caption>
<thead>
<tr><th>Aspekt</th><th>IronBarCode</th><th>Aspose.BarCode</th></tr>
</thead>
<tbody>
<tr><td>Wyzwalacz walidacji</td><td>Automatyczne; uruchamia się podczas każdego dekodowania</td><td>Wyraźne: <code>Suma kontrolnaValidation.On</code> / <code>Off</code> / <code>Default</code></td></tr>
<tr><td>Wymagane działanie programisty</td><td>Brak; nieprawidłowe BarCodes są wykluczane z wyników</td><td>Przed odczytem należy ustawić <code>BarcodeSettings.Suma kontrolnaValidation</code></td></tr>
<tr><td>Wyłącz sumę kontrolną</td><td>Nieujawnione; sumy kontrolne są zawsze egzekwowane dla formatów obowiązkowych</td><td>Tak; <code>Suma kontrolnaValidation.Off</code> pomija weryfikację</td></tr>
<tr><td>Opcjonalne formaty sum kontrolnych (Code39)</td><td>Wykorzystuje <code>Confidence</code> + <code>RemoveFalsePositive</code> do filtrowania odczytów niskiej jakości</td><td>Wyraźnie włącz za pomocą <code>EnableSuma kontrolna.Tak</code></td></tr>
<tr><td>Zachowanie w przypadku niepowodzenia</td><td>BarCode został pominięty w wynikach</td><td>BarCode może pojawić się z oddzielną wartością sumy kontrolnej do ręcznej weryfikacji</td></tr>
</tbody>
</table>
</div>
Dla symbologii z opcjonalnymi sumami kontrolnymi, takich jak Code39, biblioteka używa punktacji pewności i `RemoveFalsePositive` zamiast przełącznika sumy kontrolnej.
### Dane wejściowe
Etykieta magazynowa Code128 (scenariusz poprawny) oraz pusty obraz bez BARCODE (scenariusz nieprawidłowy).
<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="Kod kreskowy Code128 kodujący RACK-A1-LOT-7382 użyty jako dane wejściowe skanu regału magazynowego"
class="img-responsive add-shadow" />
<p style="color: #181818; font-style: italic; text-align: center;">warehouse-rack.png (ścieżka sukcesu)</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="Pusty biały obraz bez kodu kreskowego, wywołujący ścieżkę pustego wyniku"
class="img-responsive add-shadow" />
<p style="color: #181818; font-style: italic; text-align: center;">blank-no-BarCode.png (ścieżka błędu - brak BarCode)</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");
}
```
### Wynik
#### Droga do sukcesu
<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="Wynik konsoli pokazujący dekodowany kod Code128 RACK-A1-LOT-7382 powyżej progu pewności"
class="img-responsive add-shadow" />
</div>
</div>
Kod kreskowy na regale magazynowym wrócił jako `RACK-A1-LOT-7382` na stronie 0. Przekroczył próg pewności 85% i przeszedł walidację sumy kontrolnej, więc pojawia się w `BarcodeResults`.
#### Ścieżka błędu
<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="Wynik konsoli pokazujący komunikat WARN: nie znaleziono prawidłowych BARCODE-ów dla pustego obrazu wprowadzonego jako dane wejściowe"
class="img-responsive add-shadow" />
</div>
</div>
Podniesienie `ConfidenceThreshold` powyżej jego domyślnego poziomu 0,7 zaostrza to przejście dalej dla symbologii z opcjonalną sumą kontrolną, takich jak Code39.
Po sprawdzeniu sum kontrolnych następnym krokiem jest ograniczenie czytnika do formatów BARCODE, których oczekuje Twój system.
---
## Jak korzystać z funkcji odczytu BarCodes z uwzględnieniem formatowania?
Enum `BarcodeEncoding` jest typu flags, co pozwala na łączenie wielu formatów przy użyciu operatora bitowego OR. Ustawienie `ExpectBarcodeTypes` ogranicza czytnik do tych formatów i pomija detekcję dla innych.
<div class="content__data-table" data-content-table>
<table>
<caption>Typowe wartości kodowania kodów kreskowych</caption>
<thead>
<tr><th>Wartość</th><th>Kategoria</th><th>Opis</th><th>Suma kontrolna</th></tr>
</thead>
<tbody>
<tr><td><code>BarcodeEncoding.All</code></td><td>Meta</td><td>Wszystkie obsługiwane formaty (domyślne zachowanie)</td><td>W zależności od formatu</td></tr>
<tr><td><code>BarcodeEncoding.AllOneDimensional</code></td><td>Meta</td><td>Wszystkie formaty liniowe (1D), w tym ułożone w stos</td><td>W zależności od formatu</td></tr>
<tr><td><code>BarcodeEncoding.AllTwoDimensional</code></td><td>Meta</td><td>Wszystkie formaty matrycowe/siatkowe (2D)</td><td>W zależności od formatu</td></tr>
<tr><td><code>BarcodeEncoding.Code128</code></td><td>1D</td><td>Alfanumeryczne o dużej gęstości (logistyka, wysyłka)</td><td>Obowiązkowe (waga Mod103)</td></tr>
<tr><td><code>BarcodeEncoding.EAN13</code></td><td>1D</td><td>Identyfikacja produktów detalicznych, 13 cyfr</td><td>Obowiazkowe (Mod10)</td></tr>
<tr><td><code>BarcodeEncoding.QRCode</code></td><td>2D</td><td>Macierz o duzej pojemnosci (URL-e, dane strukturalne)</td><td>Kod Reed-Solomona ECC</td></tr>
<tr><td><code>BarcodeEncoding.Code39</code></td><td>1D</td><td>Alfanumeryczny (obrona, motoryzacja)</td><td>Opcjonalne (Mod43)</td></tr>
<tr><td><code>BarcodeEncoding.UPCA</code></td><td>1D</td><td>Handel detaliczny w Ameryce Polnocnej, 12 cyfr</td><td>Obowiazkowe (Mod10)</td></tr>
<tr><td><code>BarcodeEncoding.DataMatrix</code></td><td>2D</td><td>Kompaktowa macierz (elektronika, farmacja)</td><td>Kod Reed-Solomona ECC</td></tr>
<tr><td><code>BarcodeEncoding.PDF417</code></td><td>2D</td><td>Stosy (karty ID, transport)</td><td>Kod Reed-Solomona ECC</td></tr>
</tbody>
</table>
</div>
Poza szybkościa, ograniczenie zbioru formatow działa jako bramka walidacyjna: kody kreskowe dowolnej nieumieszczonej symbologii sa wykluczane z wynikow, nawet jeśli fizycznie wystepuja w obrazie.
### Dane wejściowe
Etykieta wysylkowa Code128 (ścieżka sukcesu) i kod QR, ktory nie pasuje do ograniczenia tylko dla Code128 (ścieżka porazki).
<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="Kod kreskowy Code128 kodujący SHIP-2024-00438 użyty jako dane wejściowe etykiety wysyłkowej"
class="img-responsive add-shadow" />
<p style="color: #181818; font-style: italic; text-align: center;">shipping-label.png (ścieżka sukcesu - Code128 pasuje do ograniczenia)</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="Kod QR użyty jako ścieżka błędu niezgodności formatu przy odczycie ograniczonym wyłącznie do Code128"
class="img-responsive add-shadow" />
<p style="color: #181818; font-style: italic; text-align: center;">qr-format-mismatch.png (ścieżka porazki - QR odrzucony przez filtr tylko-dla-Code128)</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}");
}
```
### Wynik
#### Droga do sukcesu
<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="Wyjscie z konsoli pokazujace ograniczony odczyt znajdujacy 1 kod kreskowy Code128 i szeroki odczyt potwierdzajacy go"
class="img-responsive add-shadow" />
</div>
</div>
Etykieta wysyłkowa ma wartość `SHIP-2024-00438`. Ograniczony odczyt zbiera go natychmiast, poniewaz Code128 jest tym, co oczekuje filtr, a szeroki odczyt potwierdza ten sam wynik we wszystkich formatach.
#### Ścieżka błędu
<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="Wyjscie z konsoli pokazujace ograniczony odczyt zwracajacy 0 wynikow dla obrazu kodu QR"
class="img-responsive add-shadow" />
</div>
</div>
Puste wyniki z ograniczonego odczytu to sygnal walidacji, nie błąd; zaloguj rozbieznosc do przeglądu.
Dla pul, ktore mieszaja formaty kodow kreskowych (np. list przewozowy z zarowno kodem produktu EAN-13, jak i numerem sledzenia Code128), polacz oczekiwane formaty:
```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
};
```
Każdy zwrócony `BarcodeResult.BarcodeType` identyfikuje, który format został zdekodowany, umożliwiając routing w dół strumienia.
### Jakie Symbologie Obsluguja Walidacje Sum Kontrolnych?
Nie wszystkie formaty kodow kreskowych używają sum kontrolnych w ten sam sposob. Poniższa tabela mapuje powszechne symbologie do ich charakterystyk wykrywania błędów, co informuje, jak agresywnie ustawić `ConfidenceThreshold` i `RemoveFalsePositive` dla każdego formatu:
<div class="content__data-table" data-content-table>
<table>
<caption>Charakterystyka sum kontrolnych wedlug symbologii</caption>
<thead>
<tr><th>Symbologia</th><th>Typ sumy kontrolnej</th><th>Obowiazkowe?</th><th>Zalecenie</th></tr>
</thead>
<tbody>
<tr><td>EAN-13 / EAN-8</td><td>Mod10</td><td>Tak</td><td>Domyslne ustawienia wystarczajace; suma kontrolna zawsze egzekwowana</td></tr>
<tr><td>UPC-A / UPC-E</td><td>Mod10</td><td>Tak</td><td>Domyslne ustawienia wystarczajace; cyfra kontrolna automatycznie poprawiana podczas zapisu</td></tr>
<tr><td>Code128</td><td>Wazona Mod103</td><td>Tak</td><td>Domyslne ustawienia wystarczajace; obowiazkowe zgodnie ze specyfikacja</td></tr>
<tr><td>Code39</td><td>Mod43</td><td>Opcjonalne</td><td>Podnies <code>ConfidenceThreshold</code> do 0.8+ i włącz <code>RemoveFalsePositive</code></td></tr>
<tr><td>Codabar</td><td>Mod16</td><td>Opcjonalne</td><td>Jak w przypadku Code39; uzyj oceniania pewnosci jako bramki jakosci</td></tr>
<tr><td>ITF</td><td>Mod10</td><td>Opcjonalne</td><td>Włącz <code>RemoveFalsePositive</code> dla formatow przeplatanych</td></tr>
<tr><td>QRCode / DataMatrix</td><td>Kod Reed-Solomona ECC</td><td>Zawsze</td><td>Strukturalna korekcja błędów; dodatkowa konfiguracja nie jest potrzebna</td></tr>
<tr><td>PDF417</td><td>Kod Reed-Solomona ECC</td><td>Zawsze</td><td>Jak QR/DataMatrix; korekcja błędów jest wbudowana</td></tr>
</tbody>
</table>
</div>
Dla symbologii 2D, takich jak QR, DataMatrix i PDF417, korekcja błędów jest zintegrowana ze struktura kodu. Te formaty mogą odzyskac sie z częściowych uszkodzen bez polegania na prostej cyfrze kontrolnej. `ConfidenceThreshold` nadal ma zastosowanie podczas fazy wykrywania ML, gdy krok dekodowania korzysta z wbudowanej redundancji symbologii.
Teraz, gdy obie techniki sa zrozumiane, polaczmy je w jeden, gotowy do produkcji wzorzec walidacyjny.
---
## Jak Połączyć Sumy Kontrolne z Ograniczeniami Formatow?
Gotowy do produkcji wzorzec ustawia `ExpectBarcodeTypes`, `RemoveFalsePositive`, `ConfidenceThreshold` i `Speed` w jednym obiekcie `BarcodeReaderOptions`. Razem tworza warstwowa bramke: ograniczenia formatow zawężają przestrzeń wyszukiwania, walidacja sumy kontrolnej zapewnia integralność danych, ocenianie pewnosci filtruje marginalne dekodowania, a usuwanie wynikow falszywie pozytywnych dodaje dodatkowe sprawdzenie.
### Dane wejściowe
Trzy skanowane kody kreskowe z POS z katalogu `pos-scans/` używane jako ścieżka sukcesu: dwie EAN-13 i jeden UPC-A. Etykieta regału magazynowego Code128 jest używana jako ścieżka niepowodzenia – ograniczenie EAN-13/UPC-A ją odrzuca i rejestruje linię `REJECT`.
<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 (sukces)</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 (sukces)</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 (sukces)</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="Kod kreskowy Code128 kodujący RACK-A1-LOT-7382 użyty jako dane wejściowe ścieżki błędu walidacji łączonej"
class="img-responsive add-shadow" />
<p style="color: #181818; font-style: italic; text-align: center;">warehouse-rack.png (porazka - Code128 odrzucony)</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}");
}
```
### Wynik
#### Droga do sukcesu
<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="Wyjscie z konsoli pokazujace, ze wszystkie 3 kody kreskowe skanow POS zostaly zaakceptowane ze statusem OK i zdekodowanymi wartosciami"
class="img-responsive add-shadow" />
</div>
</div>
Wszystkie trzy obrazy skanow POS przeszly. Czytnik zwrócił wartości `5901234123471`, `4006381333931` i `012345678905`. Kazdy z nich pasowal do filtru `EAN13|UPCA|UPCE`, mial ważna sume kontrolna Mod10, a pewnosc byla powyzej 0.8.
#### Ścieżka błędu
<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="Wyjscie z konsoli pokazujace, ze kod kreskowy Code128 regalu magazynowego zostal odrzucony przez filtr EAN-13/UPC-A"
class="img-responsive add-shadow" />
</div>
</div>
Ustawienie `MinScanLines` na 3 zwiększa minimalną liczbę zgadzających się linii skanowania wymaganych do uznania kodu kreskowego 1D za prawidłowy; domyslnie jest to 2. Podniesienie tej wartosci zmniejsza ryzyko duchowych odczytów z halasliwych linii skanowania, ale może powodowac, ze cienkie lub częściowo uszkodzone kody kreskowe mogą być pomijane. W środowiskach detalicznych POS z czystymi wydrukowanymi etykietami wartosc 3 jest konserwatywnym wyborem, ktory wzmacnia walidacje bez wpływu na przepustowosc.
Twierdzenie `BarcodeType` po odczycie to obrona w głąb: `ExpectBarcodeTypes` już filtruje, ale wyraźne sprawdzenie dokumentuje intencję i łapie dryf konfiguracji bez kosztu środowiskowego. Do strojenia prędkości, `ReadingSpeed.Faster` pasuje do czystych etykiet drukowanych maszynowo; `Detailed` i `ExtremeDetail` odzyskuje uszkodzone lub słabo oświetlone kody kreskowe kosztem dłuższego czasu skanowania.
---
## Jakie są moje kolejne kroki?
Ten artykuł obejmował model weryfikacji sum kontrolnych IronBarCode, enum flag `BarcodeEncoding` dla odczytów ograniczonych formatem i połączony wzorzec weryfikacji z użyciem `ExpectBarcodeTypes`, `ConfidenceThreshold`, `RemoveFalsePositive` i `MinScanLines` jako wielowarstwowe bramy jakości.
Dla dalszej lektury, zobacz te zasoby:
- [Poreczniki IronBarCode - Czytanie Kodow Kreskowych](https://ironsoftware.com/csharp/barcode/tutorials/reading-barcodes/) dla kompletnego przegląd citatow konca-naszym.
- [Zapobieganie fałszywym pozytywom](https://ironsoftware.com/csharp/barcode/troubleshooting/false-positives/) dla mechanizmu `RemoveFalsePositive` w szczegółach.
- [Przyklady Progów Pewnosci](https://ironsoftware.com/csharp/barcode/examples/confidence-threshold/) dla dostrojenia opartego na detekcji ML.
- [Formaty danych wyjściowych](https://ironsoftware.com/csharp/barcode/how-to/output-data-formats/) dla odniesienia do właściwości `BarcodeResult`.
- [Jak Znalesc Korekcja Obrazu](https://ironsoftware.com/csharp/barcode/how-to/image-correction/) dla filtrów poprawiajacych dokładność dekodowania.
- [Dokumentacja API BarcodeReaderOptions](https://ironsoftware.com/csharp/barcode/object-reference/api/IronBarCode.BarcodeReaderOptions.html) dla pełnej dokumentacji konfiguracji.
- [Dokumentacja API BarcodeEncoding](https://ironsoftware.com/csharp/barcode/object-reference/api/IronBarCode.BarcodeEncoding.html) dla pełnej listy obsługiwanych symbologii.
[Pobierz bezpłatna licencje próbna](https://ironsoftware.com/csharp/barcode/#trial-license), aby przetestowac wszystkie funkcje w środowisku na zywo, lub [zobacz opcje licencjonowania](https://ironsoftware.com/csharp/barcode/licensing/), gdy potok jest gotowy do produkcji.
Sumy kontrolne BarCode pomagają wykrywać błędy zastąpienia. Na przykład jedna zamieniona cyfra w etykiecie EAN-13 może spowodować wysłanie paczki do niewłaściwego magazynu. Odczyt uwzględniający format zapewnia dodatkową warstwę walidacji poprzez ograniczenie dekodera do oczekiwanych symboli. Takie podejście ogranicza liczbę fałszywych alarmów spowodowanych szumem tła i skraca czas skanowania poprzez pomijanie zbędnych detektorów formatów.
IronBarCode automatycznie weryfikuje sumę kontrolną podczas dekodowania. Algorytm cyfr kontrolnych każdej symboliki działa domyślnie, a BARCODES, które nie przejdą weryfikacji, są odrzucane przed zwróceniem wyników. Właściwość BarcodeReaderOptions.ExpectBarcodeTypes ogranicza odczyty do określonych formatów, podczas gdy RemoveFalsePositive dodaje sekundarny skan dla jednoznacznych odczytów.
Ten przewodnik wyjaśnia, jak walidować sumy kontrolne kodów kreskowych, ograniczać odczyty do oczekiwanych formatów i łączyć obie techniki w wielowarstwową bramę jakości z użyciem BarcodeReaderOptions.
Szybki start: Sprawdzanie poprawności BarCodes za pomocą sum kontrolnych i ograniczeń formatowych
Skonfiguruj BarcodeReaderOptions z ExpectBarcodeTypes i RemoveFalsePositive, aby ograniczyć odczyty do oczekiwanych symbologii z automatyczną weryfikacją sumy kontrolnej.
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)
Ustaw ExpectBarcodeTypes na symbole obecne w potoku
Włącz opcję RemoveFalsePositive w celu dodatkowej weryfikacji
Wywołaj BarcodeReader.Read w celu dekodowania; sumy kontrolne są weryfikowane automatycznie podczas dekodowania
Jak zweryfikować sumy kontrolne BarCode'ów?
IronBarCode weryfikuje sumy kontrolne podczas dekodowania zgodnie ze specyfikacją danej symboliki. Na przykład podczas odczytu barcodu EAN-13 cyfra kontrolna Mod10 jest obliczana na podstawie pierwszych 12 cyfr i porównywana z 13. Jeśli cyfry nie pasują, kod kreskowy jest cicho odrzucany i nie pojawia się w kolekcji BarcodeResults. Podejście to ma zastosowanie do wszystkich formatów z obowiązkową cyfrą kontrolną, w tym UPC-A, UPC-E, EAN-8, Code128, ITF i innych.
Ten model domyślny różni się od bibliotek, które udostępniają wyraźny przełącznik. Poniższa tabela przedstawia porównanie tych dwóch podejść:
Porównanie modeli weryfikacji sum kontrolnych: IronBarCode vs. Aspose.BarCode
Aspekt
IronBarCode
Aspose.BarCode
Wyzwalacz walidacji
Automatyczne; uruchamia się podczas każdego dekodowania
Wyraźne: Suma kontrolnaValidation.On / Off / Default
Wymagane działanie programisty
Brak; nieprawidłowe BarCodes są wykluczane z wyników
Przed odczytem należy ustawić BarcodeSettings.Suma kontrolnaValidation
Wyłącz sumę kontrolną
Nieujawnione; sumy kontrolne są zawsze egzekwowane dla formatów obowiązkowych
Wykorzystuje Confidence + RemoveFalsePositive do filtrowania odczytów niskiej jakości
Wyraźnie włącz za pomocą EnableSuma kontrolna.Tak
Zachowanie w przypadku niepowodzenia
BarCode został pominięty w wynikach
BarCode może pojawić się z oddzielną wartością sumy kontrolnej do ręcznej weryfikacji
Dla symbologii z opcjonalnymi sumami kontrolnymi, takich jak Code39, biblioteka używa punktacji pewności i RemoveFalsePositive zamiast przełącznika sumy kontrolnej.
Dane wejściowe
Etykieta magazynowa Code128 (scenariusz poprawny) oraz pusty obraz bez BARCODE (scenariusz nieprawidłowy).
warehouse-rack.png (ścieżka sukcesu)
blank-no-BarCode.png (ścieżka błędu - brak BarCode)
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
Wynik
Droga do sukcesu
Kod kreskowy na regale magazynowym wrócił jako RACK-A1-LOT-7382 na stronie 0. Przekroczył próg pewności 85% i przeszedł walidację sumy kontrolnej, więc pojawia się w BarcodeResults.
Ścieżka błędu
Podniesienie ConfidenceThreshold powyżej jego domyślnego poziomu 0,7 zaostrza to przejście dalej dla symbologii z opcjonalną sumą kontrolną, takich jak Code39.
Po sprawdzeniu sum kontrolnych następnym krokiem jest ograniczenie czytnika do formatów BARCODE, których oczekuje Twój system.
Jak korzystać z funkcji odczytu BarCodes z uwzględnieniem formatowania?
Enum BarcodeEncoding jest typu flags, co pozwala na łączenie wielu formatów przy użyciu operatora bitowego OR. Ustawienie ExpectBarcodeTypes ogranicza czytnik do tych formatów i pomija detekcję dla innych.
Typowe wartości kodowania kodów kreskowych
Wartość
Kategoria
Opis
Suma kontrolna
BarcodeEncoding.All
Meta
Wszystkie obsługiwane formaty (domyślne zachowanie)
W zależności od formatu
BarcodeEncoding.AllOneDimensional
Meta
Wszystkie formaty liniowe (1D), w tym ułożone w stos
W zależności od formatu
BarcodeEncoding.AllTwoDimensional
Meta
Wszystkie formaty matrycowe/siatkowe (2D)
W zależności od formatu
BarcodeEncoding.Code128
1D
Alfanumeryczne o dużej gęstości (logistyka, wysyłka)
Obowiązkowe (waga Mod103)
BarcodeEncoding.EAN13
1D
Identyfikacja produktów detalicznych, 13 cyfr
Obowiazkowe (Mod10)
BarcodeEncoding.QRCode
2D
Macierz o duzej pojemnosci (URL-e, dane strukturalne)
Kod Reed-Solomona ECC
BarcodeEncoding.Code39
1D
Alfanumeryczny (obrona, motoryzacja)
Opcjonalne (Mod43)
BarcodeEncoding.UPCA
1D
Handel detaliczny w Ameryce Polnocnej, 12 cyfr
Obowiazkowe (Mod10)
BarcodeEncoding.DataMatrix
2D
Kompaktowa macierz (elektronika, farmacja)
Kod Reed-Solomona ECC
BarcodeEncoding.PDF417
2D
Stosy (karty ID, transport)
Kod Reed-Solomona ECC
Poza szybkościa, ograniczenie zbioru formatow działa jako bramka walidacyjna: kody kreskowe dowolnej nieumieszczonej symbologii sa wykluczane z wynikow, nawet jeśli fizycznie wystepuja w obrazie.
Dane wejściowe
Etykieta wysylkowa Code128 (ścieżka sukcesu) i kod QR, ktory nie pasuje do ograniczenia tylko dla Code128 (ścieżka porazki).
shipping-label.png (ścieżka sukcesu - Code128 pasuje do ograniczenia)
qr-format-mismatch.png (ścieżka porazki - QR odrzucony przez filtr tylko-dla-Code128)
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
Wynik
Droga do sukcesu
Etykieta wysyłkowa ma wartość SHIP-2024-00438. Ograniczony odczyt zbiera go natychmiast, poniewaz Code128 jest tym, co oczekuje filtr, a szeroki odczyt potwierdza ten sam wynik we wszystkich formatach.
Ścieżka błędu
Puste wyniki z ograniczonego odczytu to sygnal walidacji, nie błąd; zaloguj rozbieznosc do przeglądu.
Dla pul, ktore mieszaja formaty kodow kreskowych (np. list przewozowy z zarowno kodem produktu EAN-13, jak i numerem sledzenia Code128), polacz oczekiwane formaty:
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
}
Każdy zwrócony BarcodeResult.BarcodeType identyfikuje, który format został zdekodowany, umożliwiając routing w dół strumienia.
Jakie Symbologie Obsluguja Walidacje Sum Kontrolnych?
Nie wszystkie formaty kodow kreskowych używają sum kontrolnych w ten sam sposob. Poniższa tabela mapuje powszechne symbologie do ich charakterystyk wykrywania błędów, co informuje, jak agresywnie ustawić ConfidenceThreshold i RemoveFalsePositive dla każdego formatu:
Charakterystyka sum kontrolnych wedlug symbologii
Symbologia
Typ sumy kontrolnej
Obowiazkowe?
Zalecenie
EAN-13 / EAN-8
Mod10
Tak
Domyslne ustawienia wystarczajace; suma kontrolna zawsze egzekwowana
UPC-A / UPC-E
Mod10
Tak
Domyslne ustawienia wystarczajace; cyfra kontrolna automatycznie poprawiana podczas zapisu
Code128
Wazona Mod103
Tak
Domyslne ustawienia wystarczajace; obowiazkowe zgodnie ze specyfikacja
Code39
Mod43
Opcjonalne
Podnies ConfidenceThreshold do 0.8+ i włącz RemoveFalsePositive
Codabar
Mod16
Opcjonalne
Jak w przypadku Code39; uzyj oceniania pewnosci jako bramki jakosci
ITF
Mod10
Opcjonalne
Włącz RemoveFalsePositive dla formatow przeplatanych
QRCode / DataMatrix
Kod Reed-Solomona ECC
Zawsze
Strukturalna korekcja błędów; dodatkowa konfiguracja nie jest potrzebna
PDF417
Kod Reed-Solomona ECC
Zawsze
Jak QR/DataMatrix; korekcja błędów jest wbudowana
Dla symbologii 2D, takich jak QR, DataMatrix i PDF417, korekcja błędów jest zintegrowana ze struktura kodu. Te formaty mogą odzyskac sie z częściowych uszkodzen bez polegania na prostej cyfrze kontrolnej. ConfidenceThreshold nadal ma zastosowanie podczas fazy wykrywania ML, gdy krok dekodowania korzysta z wbudowanej redundancji symbologii.
Teraz, gdy obie techniki sa zrozumiane, polaczmy je w jeden, gotowy do produkcji wzorzec walidacyjny.
Jak Połączyć Sumy Kontrolne z Ograniczeniami Formatow?
Gotowy do produkcji wzorzec ustawia ExpectBarcodeTypes, RemoveFalsePositive, ConfidenceThreshold i Speed w jednym obiekcie BarcodeReaderOptions. Razem tworza warstwowa bramke: ograniczenia formatow zawężają przestrzeń wyszukiwania, walidacja sumy kontrolnej zapewnia integralność danych, ocenianie pewnosci filtruje marginalne dekodowania, a usuwanie wynikow falszywie pozytywnych dodaje dodatkowe sprawdzenie.
Dane wejściowe
Trzy skanowane kody kreskowe z POS z katalogu pos-scans/ używane jako ścieżka sukcesu: dwie EAN-13 i jeden UPC-A. Etykieta regału magazynowego Code128 jest używana jako ścieżka niepowodzenia – ograniczenie EAN-13/UPC-A ją odrzuca i rejestruje linię REJECT.
pos-scan-1.png (sukces)
pos-scan-2.png (sukces)
pos-scan-3.png (sukces)
warehouse-rack.png (porazka - Code128 odrzucony)
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
Wynik
Droga do sukcesu
Wszystkie trzy obrazy skanow POS przeszly. Czytnik zwrócił wartości 5901234123471, 4006381333931 i 012345678905. Kazdy z nich pasowal do filtru EAN13|UPCA|UPCE, mial ważna sume kontrolna Mod10, a pewnosc byla powyzej 0.8.
Ścieżka błędu
Ustawienie MinScanLines na 3 zwiększa minimalną liczbę zgadzających się linii skanowania wymaganych do uznania kodu kreskowego 1D za prawidłowy; domyslnie jest to 2. Podniesienie tej wartosci zmniejsza ryzyko duchowych odczytów z halasliwych linii skanowania, ale może powodowac, ze cienkie lub częściowo uszkodzone kody kreskowe mogą być pomijane. W środowiskach detalicznych POS z czystymi wydrukowanymi etykietami wartosc 3 jest konserwatywnym wyborem, ktory wzmacnia walidacje bez wpływu na przepustowosc.
Twierdzenie BarcodeType po odczycie to obrona w głąb: ExpectBarcodeTypes już filtruje, ale wyraźne sprawdzenie dokumentuje intencję i łapie dryf konfiguracji bez kosztu środowiskowego. Do strojenia prędkości, ReadingSpeed.Faster pasuje do czystych etykiet drukowanych maszynowo; Detailed i ExtremeDetail odzyskuje uszkodzone lub słabo oświetlone kody kreskowe kosztem dłuższego czasu skanowania.
Jakie są moje kolejne kroki?
Ten artykuł obejmował model weryfikacji sum kontrolnych IronBarCode, enum flag BarcodeEncoding dla odczytów ograniczonych formatem i połączony wzorzec weryfikacji z użyciem ExpectBarcodeTypes, ConfidenceThreshold, RemoveFalsePositive i MinScanLines jako wielowarstwowe bramy jakości.
Co to jest walidacja sumy kontrolnej kodu kreskowego?
Walidacja sumy kontrolnej kodu kreskowego to proces, który zapewnia dokładność danych kodu kreskowego poprzez weryfikację obliczonej sumy kontrolnej z wartością zakodowaną w kodzie kreskowym. Pomaga to w wykrywaniu błędów w procesie skanowania.
Jak IronBarcode obsługuje walidację sumy kontrolnej?
IronBarcode automatycznie obsługuje walidację sumy kontrolnej, obliczając sumę kontrolną dla danych kodu kreskowego i weryfikując ją z zakodowaną sumą kontrolną, zapewniając integralność danych podczas procesu skanowania.
Czym są filtry BarcodeEncoding?
Filtry BarcodeEncoding w IronBarcode pozwalają określić, które formaty kodów kreskowych odczytywać lub ignorować podczas skanowania, umożliwiając bardziej dokładne i efektywne przetwarzanie kodów kreskowych poprzez skupienie się na konkretnych typach kodów.
Czy IronBarcode może wykonać złożoną walidację?
Tak, IronBarcode może wykonać złożoną walidację, sprawdzając zarówno sumę kontrolną, jak i format kodów kreskowych podczas procesu skanowania, zapewniając, że tylko prawidłowe i poprawnie sformatowane kody kreskowe są przetwarzane.
Czy można ograniczyć odczyty kodów kreskowych według formatu w C# za pomocą IronBarcode?
Tak, IronBarcode pozwala ograniczyć odczyty kodów kreskowych poprzez określenie formatów, które chcesz uwzględnić lub wykluczyć, zapewniając, że twoja aplikacja przetwarza tylko istotne typy kodów kreskowych.
Dlaczego świadome formatu czytanie jest ważne w przetwarzaniu kodów kreskowych?
Świadome formatu czytanie jest ważne, ponieważ pozwala twojej aplikacji przetwarzać tylko określone typy kodów kreskowych, poprawiając szybkość i dokładność poprzez ignorowanie nieistotnych lub nieobsługiwanych formatów kodów kreskowych.
Jak zaimplementować świadome formatu czytanie w IronBarcode?
Aby zaimplementować świadome formatu czytanie w IronBarcode, użyj filtrów BarcodeEncoding, aby określić formaty kodów kreskowych, które chcesz odczytać. Można to zrobić za pośrednictwem API biblioteki, co pozwala na precyzyjną kontrolę nad wymaganiami dotyczącymi skanowania kodów kreskowych.
Jakie są korzyści z użycia IronBarcode do walidacji kodów kreskowych?
IronBarcode oferuje kilka korzyści dla walidacji kodów kreskowych, w tym solidną weryfikację sum kontrolnych, świadome formatu czytanie oraz możliwość obsługi szerokiego zakresu standardów kodów kreskowych, zapewniając wysoką dokładność i elastyczność w przetwarzaniu kodów kreskowych.
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 posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podręczników.