# Barkod Kontrol Toplamlarını Doğrulama ve Format Bilinçli Okuma Nasıl Kullanılır
Barkod kontrol toplamları, yer değiştirme hatalarını tespit etmeye yardımcı olur. Örneğin, bir EAN-13 etiketindeki tek bir yer değiştirilmiş rakam, bir paketin yanlış depoya gönderilmesine neden olabilir. Format bilgili okuma, kod çözücüyü beklenen sembolojilere sınırlayarak ek bir doğrulama katmanı sağlar. Bu yaklaşım, arka plan gürültüsünden kaynaklanan yanlış pozitifleri azaltır ve gereksiz format algılayıcıları atlatarak tarama süresini kısaltır.
IronBarcode otomatik olarak, kod çözme sırasında kontrol toplamı doğrulaması yapar. Her sembolün kontrol rakamı algoritması varsayılan olarak çalışır ve başarısız olan barkodlar, sonuçlar döndürülmeden önce elenir. `BarcodeReaderOptions.ExpectBarcodeTypes` özelliği, okumaları belirli formatlarla sınırlar, `RemoveFalsePositive` ise belirsiz okumalar için ikincil bir tarama ekler.
Bu kılavuz, barkod kontrol toplamlarının nasıl doğrulanacağını, okumaların beklenen formatlarla nasıl sınırlandırılacağını ve her iki tekniğin de `BarcodeReaderOptions` kullanılarak katmanlı bir kalite kapısı haline nasıl getirileceğini açıklar.
*as-heading:2(Hızlı Başlangıç: Kontrol Toplamı ve Format Kısıtlamaları ile Barkodları Doğrulayın)*
`BarcodeReaderOptions`, okumaları otomatik kontrol toplamı doğrulaması ile beklenen simboojilere uyacak şekilde sınırlamak için `ExpectBarcodeTypes` ve `RemoveFalsePositive` ile yapılandırın.
```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>Asgari İş Akışı (5 adım)</h3>
<ol>
<li><a class="js-modal-open" data-modal-id="trial-license-after-download" href="https://nuget.org/packages/BarCode/">IronBarcode kütüphanesini NuGet'ten indirin</a></li>
<li>Bir <code>BarcodeReaderOptions</code> instance oluşturun</li>
<li><code>ExpectBarcodeTypes</code> işlem hattındaki mevcut sembolojiler için ayarlayın</li>
<li>İkincil doğrulama için <code>RemoveFalsePositive</code> etkinleştirin</li>
<li><code>BarcodeReader.Read</code> çağırarak kod çözümünü yapın, kontrol toplamları çözümleme sırasında otomatik olarak doğrulanır</li>
</ol>
</div>
## Barkod Kontrol Toplamlarını Nasıl Doğrularım?
IronBarcode, her sembolün spesifikasyonuna göre, kod çözümleme sırasında kontrol toplamlarını doğrular. Örneğin, bir EAN-13 barkodu okunurken, ilk 12 rakamdan Mod10 kontrol rakamı hesaplanır ve 13. rakamla karşılaştırılır. Rakamlar eşleşmezse, barkod sessizce reddedilir ve `BarcodeResults` koleksiyonunda görünmez. Bu yaklaşım, UPC-A, UPC-E, EAN-8, Kod128, ITF ve diğerleri dahil olmak üzere kontrol rakamı zorunlu tüm formatlara uygulanır.
Bu zımni model, açık bir anahtar sunan kütüphanelerden farklıdır. Aşağıdaki tablo iki yaklaşımı karşılaştırır:
<div class="content__data-table" data-content-table>
<table>
<caption>Kontrol Toplamı Doğrulama Modeli Karşılaştırması: IronBarcode vs. Aspose.BarCode</caption>
<thead>
<tr><th>Boyut</th><th>IronBarcode</th><th>Aspose.BarCode</th></tr>
</thead>
<tbody>
<tr><td>Doğrulama tetikleyicisi</td><td>Otomatik; her kod çözümleme sırasında çalışır</td><td>Açık: <code>ChecksumValidation.On</code> / <code>Off</code> / <code>Default</code></td></tr>
<tr><td>Geliştirici eylem gerektiren durumlar</td><td>Yok; geçersiz barkodlar sonuçlardan çıkarılır</td><td>Okumadan önce <code>BarcodeSettings.ChecksumValidation</code> ayarlayın</td></tr>
<tr><td>Kontrol toplamı devre dışı bırakma</td><td>Açığa çıkmaz; kontrol toplamları zorunlu formatlar için her zaman uygulanır</td><td>Evet; <code>ChecksumValidation.Off</code> doğrulamayı atlar</td></tr>
<tr><td>Opsiyonel kontrol toplamı formatları (Kod39)</td><td>Düşük kaliteli okumaları filtrelemek için <code>Confidence</code> + <code>RemoveFalsePositive</code> kullanır</td><td><code>EnableChecksum.Yes</code> ile açıkça etkinleştirilir</td></tr>
<tr><td>Başarısızlık davranışı</td><td>Barkod sonuçlardan sessizce çıkartılır</td><td>Barkod, manuel inceleme için ayrı bir kontrol toplamı değeriyle görünebilir</td></tr>
</tbody>
</table>
</div>
Kod39 gibi isteğe bağlı kontrol toplamlı simboojiler için, kütüphane bir kontrol toplam anahtarı yerine güven skorlama ve `RemoveFalsePositive` kullanır.
### Giriş
Bir Kod128 depo raf etiketi (başarı yolu) ve barkod içermeyen boş bir görüntü (başarısızlık yolu).
<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="Kod128 barcode encoding RACK-A1-LOT-7382 used as the warehouse rack scan input"
class="img-responsive add-shadow" />
<p style="color: #181818; font-style: italic; text-align: center;">warehouse-rack.png (başarı yolu)</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="Boş sonuç yolunu tetiklemek için barkod içermeyen boş beyaz görüntü"
class="img-responsive add-shadow" />
<p style="color: #181818; font-style: italic; text-align: center;">blank-no-barcode.png (başarısızlık yolu - barkod yok)</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");
}
```
### Çıktı
#### Başarı Yolu
<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="Console çıktı, Kod128 RACK-A1-LOT-7382'nin güven eşiğini aştığını gösteriyor"
class="img-responsive add-shadow" />
</div>
</div>
Depo raf barkodu sayfa 0'da `RACK-A1-LOT-7382` olarak geri geldi. %85 güven eşiğini geçti ve kontrol toplamı doğrulamasını geçti, bu nedenle `BarcodeResults`'da görünüyor.
#### Başarısızlık Yolu
<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="Console çıktı, boş görüntü girdisi için geçerli bir barkod bulamadı"
class="img-responsive add-shadow" />
</div>
</div>
Varsayılan 0.7 değerinin üzerinde `ConfidenceThreshold` yükseltmek, Kod39 gibi isteğe bağlı kontrol toplamlı simboojiler için bu kapıyı daha da sıkılaştırır.
Kontrol toplamı doğrulaması kapsandıktan sonra, sonraki adım okuyucuyu işlem hattınızın beklediği barkod formatlarına sınırlamaktır.
---
## Format Bilinçli Barkod Okuma Nasıl Kullanılır?
`BarcodeEncoding` enum türü bir bayraktır, birçok formatın bitwise OR operatörü kullanılarak bir araya getirilmesine olanak tanır. `ExpectBarcodeTypes` ayarlamak, okuyucuyu bu formatlarla sınırlandırır ve diğerlerinin tespitini atlar.
<div class="content__data-table" data-content-table>
<table>
<caption>Ortak BarkodKodlama Değerleri</caption>
<thead>
<tr><th>Değer</th><th>Kategori</th><th>Açıklama</th><th>Kontrol Toplamı</th></tr>
</thead>
<tbody>
<tr><td><code>BarcodeEncoding.All</code></td><td>Meta</td><td>Desteklenen tüm formatlar (varsayılan davranış)</td><td>Format başına</td></tr>
<tr><td><code>BarcodeEncoding.AllOneDimensional</code></td><td>Meta</td><td>Tüm lineer (1D) formatlar dahil üst üste binenleri</td><td>Format başına</td></tr>
<tr><td><code>BarcodeEncoding.AllTwoDimensional</code></td><td>Meta</td><td>Tüm matris/ızgara (2D) formatları</td><td>Format başına</td></tr>
<tr><td><code>BarcodeEncoding.Kod128</code></td><td>1D</td><td>Yüksek yoğunluklu alfanümerik (lojistik, nakliye)</td><td>Zorunlu (ağırlıklı Mod103)</td></tr>
<tr><td><code>BarcodeEncoding.EAN13</code></td><td>1D</td><td>Perakende ürün tanımlama, 13 rakam</td><td>Zorunlu (Mod10)</td></tr>
<tr><td><code>BarcodeEncoding.QRCode</code></td><td>2D</td><td>Yüksek kapasiteli matris (URL'ler, yapılandırılmış veriler)</td><td>Reed-Solomon EEC</td></tr>
<tr><td><code>BarcodeEncoding.Kod39</code></td><td>1D</td><td>Alfanümerik (savunma, otomotiv)</td><td>Opsiyonel (Mod43)</td></tr>
<tr><td><code>BarcodeEncoding.UPCA</code></td><td>1D</td><td>Kuzey Amerika perakendeciliği, 12 rakam</td><td>Zorunlu (Mod10)</td></tr>
<tr><td><code>BarcodeEncoding.DataMatrix</code></td><td>2D</td><td>Kompakt matris (elektronik, eczacılık)</td><td>Reed-Solomon EEC</td></tr>
<tr><td><code>BarcodeEncoding.PDF417</code></td><td>2D</td><td>Üst üste kapanan (kimlik kartları, ulaşım)</td><td>Reed-Solomon EEC</td></tr>
</tbody>
</table>
</div>
Hızın ötesinde, format setini sınırlamak bir doğrulama kapısı görevi görür: herhangi bir listelenmemiş sembolojiye sahip barkodlar, fiziksel olarak görüntüde mevcut olsa bile sonuçlardan dışlanır.
### Giriş
Bir Kod128 nakliye etiketi (başarı yolu) ve Kod128 yalnızca kısıtlamasına uymayan bir QR kodu (başarısızlık yolu).
<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="Kod128 barcode encoding SHIP-2024-00438 used as the shipping label input"
class="img-responsive add-shadow" />
<p style="color: #181818; font-style: italic; text-align: center;">shipping-label.png (başarı yolu - Kod128 kısıtlamayı karşılar)</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 used as the format-mismatch failure path for the Kod128-only constrained read"
class="img-responsive add-shadow" />
<p style="color: #181818; font-style: italic; text-align: center;">qr-format-mismatch.png (başarısızlık yolu - QR Kod128 yalnızca filtre tarafından reddedildi)</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}");
}
```
### Çıktı
#### Başarı Yolu
<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="Console çıktı, kısıtlı okuma 1 Kod128 barkod bulduğunu ve geniş okuma bunu onayladığını gösteriyor"
class="img-responsive add-shadow" />
</div>
</div>
Gönderi etiketi `SHIP-2024-00438` değerine sahiptir. Kısıtlı okuma, filtresinün beklediği şey olduğu için Kod128'i hemen alır ve geniş okuma aynı sonucu tüm formatlarda doğrular.
#### Başarısızlık Yolu
<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="Console çıkışı, kısıtlı okumanın bir QR kodu görüntüsü için 0 sonuç döndürdüğünü gösteriyor"
class="img-responsive add-shadow" />
</div>
</div>
Bir kısıtlı okumadan gelen boş sonuçlar bir doğrulama sinyalidir, hata değil; farkı inceleme için kaydedin.
Barkod türlerini karıştıran işlem hatları için (örneğin, bir EAN-13 ürün kodu ve bir Kod128 izleme numarası içeren paket fişi), beklenen formatları birleştirin:
```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
};
```
Her döndürülen `BarcodeResult.BarcodeType`, hangi formatın çözüldüğünü tanımlar, bu da aşağı akış yönlendirmesini sağlar.
### Hangi Sembolojiler Kontrol Toplamı Doğrulamayı Destekler?
Tüm barkod formatları, kontrol toplamlarını aynı şekilde kullanmaz. Aşağıdaki tablo, yaygın simboojileri hata tespit özelliklerine göre haritalar, bu da her format için `ConfidenceThreshold` ve `RemoveFalsePositive` nasıl agresif bir şekilde ayarlanacağını belirler:
<div class="content__data-table" data-content-table>
<table>
<caption>Sembolojiye Göre Kontrol Toplamı Özellikleri</caption>
<thead>
<tr><th>Semboloji</th><th>Kontrol Toplamı Türü</th><th>Zorunlu?</th><th>Öneri</th></tr>
</thead>
<tbody>
<tr><td>EAN-13 / EAN-8</td><td>Mod10</td><td>Evet</td><td>Varsayılan ayarlar yeterli; sağlama toplamı her zaman zorunludur</td></tr>
<tr><td>UPC-A / UPC-E</td><td>Mod10</td><td>Evet</td><td>Varsayılan ayarlar yeterli; kontrol rakamı yazma sırasında otomatik düzeltilir</td></tr>
<tr><td>Kod128</td><td>Ağırlıklı Mod103</td><td>Evet</td><td>Varsayılan ayarlar yeterli; spesifikasyona göre zorunlu</td></tr>
<tr><td>Kod39</td><td>Mod43</td><td>İsteğe bağlı</td><td>Güven Eşiği'ni 0.8+'e yükseltin ve Yanlış Pozitifleri Kaldır'ı etkinleştirin</td></tr>
<tr><td>KodaBar</td><td>Mod16</td><td>İsteğe bağlı</td><td>Kod39 ile aynı; kalite kapısı olarak güveni kullanın</td></tr>
<tr><td>ITF</td><td>Mod10</td><td>İsteğe bağlı</td><td>Ardışık biçimler için Yanlış Pozitifleri Kaldır'ı etkinleştirin</td></tr>
<tr><td>QR Kodu / Veri Matrisi</td><td>Reed-Solomon EEC</td><td>Her zaman</td><td>Yapısal hata düzeltme; ek yapılandırma gerekmez</td></tr>
<tr><td>PDF417</td><td>Reed-Solomon EEC</td><td>Her zaman</td><td>QR/DataMatrix ile aynı; hata düzeltmesi doğaldır</td></tr>
</tbody>
</table>
</div>
QR, DataMatrix ve PDF417 gibi 2D sembolojiler için hata düzeltme kodlama yapısına entegre edilmiştir. Bu formatlar, basit bir kontrol rakamına bağlı kalmadan kısmi hasardan kurtulabilir. `ConfidenceThreshold`, ML tespit aşaması boyunca hala geçerlidir, dekod aşaması simbooji içindeki yerleşik redundanstan yararlanır.
Her iki teknik de anlaşıldığına göre, bunları tek bir üretime hazır doğrulama modelinde birleştirelim.
---
## Çekimleri Format Kısıtlamalarıyla Nasıl Birleştiririz?
Üretime hazır desen tek bir `BarcodeReaderOptions` nesnesinde `ExpectBarcodeTypes`, `RemoveFalsePositive`, `ConfidenceThreshold` ve `Speed` ayarlanır. Birlikte katmanlı bir kapı oluştururlar: format kısıtlamaları arama alanını daraltır, sağlama toplamı doğrulaması veri bütünlüğünü sağlar, güvenlik eşiği sınırlandırması marjinal decode leri filtreler ve yanlış pozitiflerin kaldırılması ikincil bir doğrulama turu ekler.
### Giriş
Başarı yolu olarak kullanılan `pos-scans/` dizininden üç POS tarama barkodu: iki EAN-13 ve bir UPC-A. Bir Kod128 depo raf etiketi, başarısızlık yolu olarak kullanılır - EAN-13/UPC-A kısıtlaması bunu reddeder ve bir `REJECT` hattını kaydeder.
<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 (başarılı)</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 (başarılı)</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 (başarılı)</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="Kod128 barcode encoding RACK-A1-LOT-7382 used as the combined-validation failure path input"
class="img-responsive add-shadow" />
<p style="color: #181818; font-style: italic; text-align: center;">warehouse-rack.png (başarısız - Kod128 reddedildi)</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}");
}
```
### Çıktı
#### Başarı Yolu
<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="Konsol çıktısı, tüm 3 POS tarama barkodlarının OK statüsüne sahip kabul edildiğini ve decode edilmiş değerleri gösteriyor"
class="img-responsive add-shadow" />
</div>
</div>
Üçü de POS tarama görüntüleri geçti. Okuyucu, `5901234123471`, `4006381333931` ve `012345678905` değerlerini döndürdü. Her biri `EAN13| UPCA| UPCE` filtresiyle eşleşti, geçerli bir Mod10 sağlama toplamı vardı ve güven 0.8'in üstündeydi.
#### Başarısızlık Yolu
<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="Konsol çıktısı, EAN-13/UPC-A filtresi tarafından reddedilen depo rafı Kod128 barkodunu gösteriyor"
class="img-responsive add-shadow" />
</div>
</div>
`MinScanLines`'yi 3 olarak ayarlamak, bir 1D barkodun geçerli olması için gereken en az uyumlu tarama çizgisi sayısını artırır; varsayılan 2'dir. Bu değeri artırmak, gürültülü tarama hatlarından yanlış okuma riskini azaltır ancak ince veya kısmen tahrip olmuş barkodların kaçırılmasına neden olabilir. Temiz basılı etiketlerin bulunduğu perakende POS ortamlarda, 3 değeri doğrulamayı güçlendiren ve geçiş hızını etkilemeyen muhafazakar bir seçimdir.
Okuma sonrası `BarcodeType` beyanı derinlemesine bir savunmadır: `ExpectBarcodeTypes` zaten filtreler, ancak açık kontrol niyeti belgeler ve çalışma zamanı maliyeti olmadan yapılandırma kaymasını yakalar. Hız ayarlaması için `ReadingSpeed.Faster` temiz makine baskılı etiketlere uygundur; `Detailed` ve `ExtremeDetail`, daha uzun tarama süreleri pahasına hasarlı veya kötü aydınlatılmış barkodları kurtarır.
---
## Sonraki Adımlarım Neler?
Bu makalede IronBarcode'un örtük kontrol toplamı doğrulama modeli, format sınırlandırılmış okumalar için `BarcodeEncoding` bayrak enumu ve katmanlı kalite kapıları olarak `ExpectBarcodeTypes`, `ConfidenceThreshold`, `RemoveFalsePositive` ve `MinScanLines` kullanarak birleştirilmiş doğrulama deseni ele alındı.
Daha fazla okuma için şu kaynaklara göz atın:
- [IronBarcode Tutorials - Barkod Okuma](https://ironsoftware.com/csharp/barcode/tutorials/reading-barcodes/) uçtan uca okuma rehberleri için.
- `RemoveFalsePositive` mekanizması hakkında detaylı bilgi için [Yanlış Pozitif Önleme](https://ironsoftware.com/csharp/barcode/troubleshooting/false-positives/).
- [Güven Eşiği Örnekleri](https://ironsoftware.com/csharp/barcode/examples/confidence-threshold/) ML tabanlı tespit ayarı için.
- `BarcodeResult` özelliği başvurusu için [Çıktı Veri Formatları](https://ironsoftware.com/csharp/barcode/how-to/output-data-formats/).
- [Görüntü Düzeltme Nasıl Yapılır](https://ironsoftware.com/csharp/barcode/how-to/image-correction/) decode doğruluğunu artıran filtreler için.
- [BarcodeReaderOptions API Referansı](https://ironsoftware.com/csharp/barcode/object-reference/api/IronBarCode.BarcodeReaderOptions.html) tamamlanamış yapılandırma belgeleri için.
- [BarcodeEncoding API Referansı](https://ironsoftware.com/csharp/barcode/object-reference/api/IronBarCode.BarcodeEncoding.html) desteklenen sembolojilerin tam listesi için.
[Ücretsiz bir deneme lisansı alın](https://ironsoftware.com/csharp/barcode/#trial-license) canlı ortamda her özelliği test etmek için veya [lisans seçeneklerini görüntüleyin](https://ironsoftware.com/csharp/barcode/licensing/) üretim için hazır olduğunda.
Barkod kontrol toplamları, yer değiştirme hatalarını tespit etmeye yardımcı olur. Örneğin, bir EAN-13 etiketindeki tek bir yer değiştirilmiş rakam, bir paketin yanlış depoya gönderilmesine neden olabilir. Format bilgili okuma, kod çözücüyü beklenen sembolojilere sınırlayarak ek bir doğrulama katmanı sağlar. Bu yaklaşım, arka plan gürültüsünden kaynaklanan yanlış pozitifleri azaltır ve gereksiz format algılayıcıları atlatarak tarama süresini kısaltır.
IronBarcode otomatik olarak, kod çözme sırasında kontrol toplamı doğrulaması yapar. Her sembolün kontrol rakamı algoritması varsayılan olarak çalışır ve başarısız olan barkodlar, sonuçlar döndürülmeden önce elenir. BarcodeReaderOptions.ExpectBarcodeTypes özelliği, okumaları belirli formatlarla sınırlar, RemoveFalsePositive ise belirsiz okumalar için ikincil bir tarama ekler.
Bu kılavuz, barkod kontrol toplamlarının nasıl doğrulanacağını, okumaların beklenen formatlarla nasıl sınırlandırılacağını ve her iki tekniğin de BarcodeReaderOptions kullanılarak katmanlı bir kalite kapısı haline nasıl getirileceğini açıklar.
Hızlı Başlangıç: Kontrol Toplamı ve Format Kısıtlamaları ile Barkodları Doğrulayın
BarcodeReaderOptions, okumaları otomatik kontrol toplamı doğrulaması ile beklenen simboojilere uyacak şekilde sınırlamak için ExpectBarcodeTypes ve RemoveFalsePositive ile yapılandırın.
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)
ExpectBarcodeTypes işlem hattındaki mevcut sembolojiler için ayarlayın
İkincil doğrulama için RemoveFalsePositive etkinleştirin
BarcodeReader.Read çağırarak kod çözümünü yapın, kontrol toplamları çözümleme sırasında otomatik olarak doğrulanır
Barkod Kontrol Toplamlarını Nasıl Doğrularım?
IronBarcode, her sembolün spesifikasyonuna göre, kod çözümleme sırasında kontrol toplamlarını doğrular. Örneğin, bir EAN-13 barkodu okunurken, ilk 12 rakamdan Mod10 kontrol rakamı hesaplanır ve 13. rakamla karşılaştırılır. Rakamlar eşleşmezse, barkod sessizce reddedilir ve BarcodeResults koleksiyonunda görünmez. Bu yaklaşım, UPC-A, UPC-E, EAN-8, Kod128, ITF ve diğerleri dahil olmak üzere kontrol rakamı zorunlu tüm formatlara uygulanır.
Bu zımni model, açık bir anahtar sunan kütüphanelerden farklıdır. Aşağıdaki tablo iki yaklaşımı karşılaştırır:
Kontrol Toplamı Doğrulama Modeli Karşılaştırması: IronBarcode vs. Aspose.BarCode
Boyut
IronBarcode
Aspose.BarCode
Doğrulama tetikleyicisi
Otomatik; her kod çözümleme sırasında çalışır
Açık: ChecksumValidation.On / Off / Default
Geliştirici eylem gerektiren durumlar
Yok; geçersiz barkodlar sonuçlardan çıkarılır
Okumadan önce BarcodeSettings.ChecksumValidation ayarlayın
Kontrol toplamı devre dışı bırakma
Açığa çıkmaz; kontrol toplamları zorunlu formatlar için her zaman uygulanır
Evet; ChecksumValidation.Off doğrulamayı atlar
Opsiyonel kontrol toplamı formatları (Kod39)
Düşük kaliteli okumaları filtrelemek için Confidence + RemoveFalsePositive kullanır
EnableChecksum.Yes ile açıkça etkinleştirilir
Başarısızlık davranışı
Barkod sonuçlardan sessizce çıkartılır
Barkod, manuel inceleme için ayrı bir kontrol toplamı değeriyle görünebilir
Kod39 gibi isteğe bağlı kontrol toplamlı simboojiler için, kütüphane bir kontrol toplam anahtarı yerine güven skorlama ve RemoveFalsePositive kullanır.
Giriş
Bir Kod128 depo raf etiketi (başarı yolu) ve barkod içermeyen boş bir görüntü (başarısızlık yolu).
warehouse-rack.png (başarı yolu)
blank-no-barcode.png (başarısızlık yolu - barkod yok)
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
Çıktı
Başarı Yolu
Depo raf barkodu sayfa 0'da RACK-A1-LOT-7382 olarak geri geldi. %85 güven eşiğini geçti ve kontrol toplamı doğrulamasını geçti, bu nedenle BarcodeResults'da görünüyor.
Başarısızlık Yolu
Varsayılan 0.7 değerinin üzerinde ConfidenceThreshold yükseltmek, Kod39 gibi isteğe bağlı kontrol toplamlı simboojiler için bu kapıyı daha da sıkılaştırır.
Kontrol toplamı doğrulaması kapsandıktan sonra, sonraki adım okuyucuyu işlem hattınızın beklediği barkod formatlarına sınırlamaktır.
Format Bilinçli Barkod Okuma Nasıl Kullanılır?
BarcodeEncoding enum türü bir bayraktır, birçok formatın bitwise OR operatörü kullanılarak bir araya getirilmesine olanak tanır. ExpectBarcodeTypes ayarlamak, okuyucuyu bu formatlarla sınırlandırır ve diğerlerinin tespitini atlar.
Ortak BarkodKodlama Değerleri
Değer
Kategori
Açıklama
Kontrol Toplamı
BarcodeEncoding.All
Meta
Desteklenen tüm formatlar (varsayılan davranış)
Format başına
BarcodeEncoding.AllOneDimensional
Meta
Tüm lineer (1D) formatlar dahil üst üste binenleri
Format başına
BarcodeEncoding.AllTwoDimensional
Meta
Tüm matris/ızgara (2D) formatları
Format başına
BarcodeEncoding.Kod128
1D
Yüksek yoğunluklu alfanümerik (lojistik, nakliye)
Zorunlu (ağırlıklı Mod103)
BarcodeEncoding.EAN13
1D
Perakende ürün tanımlama, 13 rakam
Zorunlu (Mod10)
BarcodeEncoding.QRCode
2D
Yüksek kapasiteli matris (URL'ler, yapılandırılmış veriler)
Reed-Solomon EEC
BarcodeEncoding.Kod39
1D
Alfanümerik (savunma, otomotiv)
Opsiyonel (Mod43)
BarcodeEncoding.UPCA
1D
Kuzey Amerika perakendeciliği, 12 rakam
Zorunlu (Mod10)
BarcodeEncoding.DataMatrix
2D
Kompakt matris (elektronik, eczacılık)
Reed-Solomon EEC
BarcodeEncoding.PDF417
2D
Üst üste kapanan (kimlik kartları, ulaşım)
Reed-Solomon EEC
Hızın ötesinde, format setini sınırlamak bir doğrulama kapısı görevi görür: herhangi bir listelenmemiş sembolojiye sahip barkodlar, fiziksel olarak görüntüde mevcut olsa bile sonuçlardan dışlanır.
Giriş
Bir Kod128 nakliye etiketi (başarı yolu) ve Kod128 yalnızca kısıtlamasına uymayan bir QR kodu (başarısızlık yolu).
shipping-label.png (başarı yolu - Kod128 kısıtlamayı karşılar)
qr-format-mismatch.png (başarısızlık yolu - QR Kod128 yalnızca filtre tarafından reddedildi)
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
Çıktı
Başarı Yolu
Gönderi etiketi SHIP-2024-00438 değerine sahiptir. Kısıtlı okuma, filtresinün beklediği şey olduğu için Kod128'i hemen alır ve geniş okuma aynı sonucu tüm formatlarda doğrular.
Başarısızlık Yolu
Bir kısıtlı okumadan gelen boş sonuçlar bir doğrulama sinyalidir, hata değil; farkı inceleme için kaydedin.
Barkod türlerini karıştıran işlem hatları için (örneğin, bir EAN-13 ürün kodu ve bir Kod128 izleme numarası içeren paket fişi), beklenen formatları birleştirin:
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
}
Her döndürülen BarcodeResult.BarcodeType, hangi formatın çözüldüğünü tanımlar, bu da aşağı akış yönlendirmesini sağlar.
Hangi Sembolojiler Kontrol Toplamı Doğrulamayı Destekler?
Tüm barkod formatları, kontrol toplamlarını aynı şekilde kullanmaz. Aşağıdaki tablo, yaygın simboojileri hata tespit özelliklerine göre haritalar, bu da her format için ConfidenceThreshold ve RemoveFalsePositive nasıl agresif bir şekilde ayarlanacağını belirler:
Sembolojiye Göre Kontrol Toplamı Özellikleri
Semboloji
Kontrol Toplamı Türü
Zorunlu?
Öneri
EAN-13 / EAN-8
Mod10
Evet
Varsayılan ayarlar yeterli; sağlama toplamı her zaman zorunludur
UPC-A / UPC-E
Mod10
Evet
Varsayılan ayarlar yeterli; kontrol rakamı yazma sırasında otomatik düzeltilir
Kod128
Ağırlıklı Mod103
Evet
Varsayılan ayarlar yeterli; spesifikasyona göre zorunlu
Kod39
Mod43
İsteğe bağlı
Güven Eşiği'ni 0.8+'e yükseltin ve Yanlış Pozitifleri Kaldır'ı etkinleştirin
KodaBar
Mod16
İsteğe bağlı
Kod39 ile aynı; kalite kapısı olarak güveni kullanın
ITF
Mod10
İsteğe bağlı
Ardışık biçimler için Yanlış Pozitifleri Kaldır'ı etkinleştirin
QR Kodu / Veri Matrisi
Reed-Solomon EEC
Her zaman
Yapısal hata düzeltme; ek yapılandırma gerekmez
PDF417
Reed-Solomon EEC
Her zaman
QR/DataMatrix ile aynı; hata düzeltmesi doğaldır
QR, DataMatrix ve PDF417 gibi 2D sembolojiler için hata düzeltme kodlama yapısına entegre edilmiştir. Bu formatlar, basit bir kontrol rakamına bağlı kalmadan kısmi hasardan kurtulabilir. ConfidenceThreshold, ML tespit aşaması boyunca hala geçerlidir, dekod aşaması simbooji içindeki yerleşik redundanstan yararlanır.
Her iki teknik de anlaşıldığına göre, bunları tek bir üretime hazır doğrulama modelinde birleştirelim.
Çekimleri Format Kısıtlamalarıyla Nasıl Birleştiririz?
Üretime hazır desen tek bir BarcodeReaderOptions nesnesinde ExpectBarcodeTypes, RemoveFalsePositive, ConfidenceThreshold ve Speed ayarlanır. Birlikte katmanlı bir kapı oluştururlar: format kısıtlamaları arama alanını daraltır, sağlama toplamı doğrulaması veri bütünlüğünü sağlar, güvenlik eşiği sınırlandırması marjinal decode leri filtreler ve yanlış pozitiflerin kaldırılması ikincil bir doğrulama turu ekler.
Giriş
Başarı yolu olarak kullanılan pos-scans/ dizininden üç POS tarama barkodu: iki EAN-13 ve bir UPC-A. Bir Kod128 depo raf etiketi, başarısızlık yolu olarak kullanılır - EAN-13/UPC-A kısıtlaması bunu reddeder ve bir REJECT hattını kaydeder.
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
Çıktı
Başarı Yolu
Üçü de POS tarama görüntüleri geçti. Okuyucu, 5901234123471, 4006381333931 ve 012345678905 değerlerini döndürdü. Her biri EAN13| UPCA| UPCE filtresiyle eşleşti, geçerli bir Mod10 sağlama toplamı vardı ve güven 0.8'in üstündeydi.
Başarısızlık Yolu
MinScanLines'yi 3 olarak ayarlamak, bir 1D barkodun geçerli olması için gereken en az uyumlu tarama çizgisi sayısını artırır; varsayılan 2'dir. Bu değeri artırmak, gürültülü tarama hatlarından yanlış okuma riskini azaltır ancak ince veya kısmen tahrip olmuş barkodların kaçırılmasına neden olabilir. Temiz basılı etiketlerin bulunduğu perakende POS ortamlarda, 3 değeri doğrulamayı güçlendiren ve geçiş hızını etkilemeyen muhafazakar bir seçimdir.
Okuma sonrası BarcodeType beyanı derinlemesine bir savunmadır: ExpectBarcodeTypes zaten filtreler, ancak açık kontrol niyeti belgeler ve çalışma zamanı maliyeti olmadan yapılandırma kaymasını yakalar. Hız ayarlaması için ReadingSpeed.Faster temiz makine baskılı etiketlere uygundur; Detailed ve ExtremeDetail, daha uzun tarama süreleri pahasına hasarlı veya kötü aydınlatılmış barkodları kurtarır.
Sonraki Adımlarım Neler?
Bu makalede IronBarcode'un örtük kontrol toplamı doğrulama modeli, format sınırlandırılmış okumalar için BarcodeEncoding bayrak enumu ve katmanlı kalite kapıları olarak ExpectBarcodeTypes, ConfidenceThreshold, RemoveFalsePositive ve MinScanLines kullanarak birleştirilmiş doğrulama deseni ele alındı.
Barkod kontrol toplam doğrulaması, barkod verilerinin doğruluğunu kontrol toplamının barkod içinde kodlanmış olan değerle karşılaştırılarak doğrulandığı bir süreçtir. Bu, tarama sürecindeki hataların tespit edilmesine yardımcı olur.
IronBarcode kontrol toplam doğrulamasını nasıl ele alır?
IronBarcode, barkod verilerinin kontrol toplamını hesaplayarak ve bunu kodlanmış kontrol toplamıyla karşılaştırarak kontrol toplam doğrulamasını dolaylı olarak ele alır, tarama sürecinde veri bütünlüğünü sağlar.
BarcodeEncoding filtreleri nedir?
IronBarcode'daki BarcodeEncoding filtreleri, tarama sırasında hangi barkod formatlarının okunacağını veya göz ardı edileceğini belirtmenize olanak tanır ve belirli barkod türlerine odaklanarak daha doğru ve verimli barkod işlemleri gerçekleştirmenizi sağlar.
IronBarcode birleşik doğrulama yapabilir mi?
Evet, IronBarcode, tarama sürecinde hem kontrol toplamını hem de barkodların formatını kontrol ederek birleşik doğrulama yapabilir, ve böylece sadece geçerli ve doğru formatlanmış barkodların işlenmesini sağlar.
C#'ta IronBarcode ile format kısıtlı barkod okuma mümkün mü?
Evet, IronBarcode, dahil etmek veya hariç tutmak istediğiniz formatları belirterek barkod okumalarınızı kısıtlamanıza olanak tanır, böylece uygulamanız sadece ilgili barkod türlerini işler.
Barkod işleminde format-destekli okuma neden önemlidir?
Format-destekli okuma önemlidir çünkü uygulamanızın sadece belirli türdeki barkodları işlemesine olanak tanır, böylece ilgisiz veya desteklenmeyen barkod formatlarını göz ardı ederek hız ve doğruluğu artırır.
IronBarcode'da format-destekli okuma nasıl uygulanır?
IronBarcode'da format-destekli okuma uygulamak için BarcodeEncoding filtrelerini kullanarak okumak istediğiniz barkod formatlarını belirtin. Bu, kütüphanenin API'si aracılığıyla yapılabilir ve barkod tarama gereksinimlerinizi hassas bir şekilde kontrol etmenizi sağlar.
Barkod doğrulaması için IronBarcode kullanmanın faydaları nelerdir?
IronBarcode, barkod doğrulaması için güvenli kontrol toplam doğrulama, format-destekli okuma ve geniş bir barkod standardı yelpazesini işleme becerisi dahil olmak üzere çeşitli avantajlar sunar, barkod işlemlerinde yüksek doğruluk ve esneklik sağlar.
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, Bilgisayar Bilimleri alanında Lisans Derecesine (Carleton Üniversitesi) sahip ve Node.js, TypeScript, JavaScript ve React konularında uzmanlaşmış ön uç geliştirmeyle ilgileniyor. Sezgisel ve estetik açıdan hoş kullanıcı arayüzleri oluşturma tutkunu, Curtis modern çerçevelerle çalışmayı ve iyi yapılandırılmış, görsel olarak çekici kılavuzlar oluşturmayı seviyor.