如何在C#中驗證條碼校驗和並使用格式感知讀取
條碼校驗和有助於檢測替換錯誤。 例如,在一個EAN-13標籤中,單一換位的數字可能會將包裹送到錯誤的倉庫。 格式感知讀取通過限制解碼器到預期的符號學,提供了一個額外的驗證層。 此方法降低了來自背景噪音的誤報,並通過跳過不必要的格式檢測器來縮短掃描時間。
IronBarcode在解碼過程中自動執行校驗和驗證。 每個符號學的校驗位算法預設運行,並且失敗的條碼在結果返回之前被丟棄。 RemoveFalsePositive為模糊讀取增加了次要掃描。
本指南說明如何驗證條碼校驗和,將讀取限制在預期格式內,並使用BarcodeReaderOptions將這兩種技術結合成一個分層品質門。
快速入門:使用校驗和和格式限制驗證條碼
使用RemoveFalsePositive進行配置,以限制讀取到預期符號學,並自動執行校驗和驗證。
:path=/static-assets/barcode/content-code-examples/how-to/checksum-and-format-validation/quickstart.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);
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)
最小工作流程(5步)
- 從NuGet下載IronBarcode程式庫
- 建立一個
BarcodeReaderOptions實例 - 將
ExpectBarcodeTypes設置為管道中存在的符號學 - 啟用
RemoveFalsePositive進行次要驗證 - 調用
BarcodeReader.Read進行解碼,校驗和在解碼過程中自動驗證
如何驗證條碼校驗和?
IronBarcode根據每個符號學的規範在解碼過程中驗證校驗和。 例如,當讀取一個EAN-13條碼時,Mod10校驗位是從前12位計算出來的並與第13位進行比對。 如果數字不匹配,則條碼被默默拒絕,不會出現在BarcodeResults集中。 此方法適用於所有具有強制校驗位的格式,包括UPC-A、UPC-E、EAN-8、Code128、ITF和其他格式。
這種隱含模式不同於那些顯示顯式切換的程式庫。 下表比較了兩種方法:
| 方面 | IronBarcode | Aspose.BarCode |
|---|---|---|
| 驗證觸發 | 自動;每次解碼時運行 | Explicit: ChecksumValidation.On / Off / Default |
| 需要的開發者操作 | 無;無效條碼從結果中排除 | 在讀取之前設置BarcodeSettings.ChecksumValidation |
| 禁用校驗和 | 不公開;強制格式的校驗和始終執行 | 是的;ChecksumValidation.Off跳過驗證 |
| 可選校驗和格式(Code39) | 使用Confidence + RemoveFalsePositive來過濾低質量讀取 | 顯式啟用Enable校驗和.是的 |
| 失敗行為 | 條碼在結果中默默被忽略 | 條碼可能會出現一個單獨的校驗和值進行手動檢查 |
對於具有可選校驗和的符號學,如Code39,程式庫使用信心評分和RemoveFalsePositive而不是校驗和切換。
輸入
一個Code128倉庫架標籤(成功路徑)和一個空白無條碼的圖片(失敗路徑)。
warehouse-rack.png(成功路徑)
blank-no-barcode.png(失敗路徑 — 無條碼)
:path=/static-assets/barcode/content-code-examples/how-to/checksum-and-format-validation/checksum-confidence.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");
}
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
輸出
成功路徑
倉庫架條碼在頁面0上顯示為BarcodeResults中。
失敗路徑
將ConfidenceThreshold從其0.7的預設值提高,進一步加強此門限,對於如Code39的可選校驗和符號學。
在涵蓋校驗和驗證後,下一步是將讀取器限制到您的管道所期望的條碼格式。
如何使用格式感知條碼讀取?
BarcodeEncoding枚舉是一個標誌型別,允許使用按位或運算符組合多個格式。 設置ExpectBarcodeTypes將讀取限制在這些格式上,並跳過其他格式的檢測。
| 值 | 類別 | 描述 | 校驗和 |
|---|---|---|---|
BarcodeEncoding.All | 後設 | 所有支持的格式(預設行為) | 每格式 |
BarcodeEncoding.AllOneDimensional | 後設 | 所有線性(1D)格式,包括堆疊的 | 每格式 |
BarcodeEncoding.AllTwoDimensional | 後設 | 所有矩陣/網格(2D)格式 | 每格式 |
BarcodeEncoding.Code128 | 1D | 高密度字母數字(物流,運輸) | 強制(加權Mod103) |
BarcodeEncoding.EAN13 | 1D | 零售產品識別,13位數字 | 強制(Mod10) |
BarcodeEncoding.QRCode | 2D | 高容量矩陣(URL,結構化資料) | 里多索羅門ECC |
BarcodeEncoding.Code39 | 1D | 字母數字(國防,汽車) | 可選(Mod43) |
BarcodeEncoding.UPCA | 1D | 北美零售,12位數字 | 強制(Mod10) |
BarcodeEncoding.DataMatrix | 2D | 緊湊矩陣(電子,製藥) | 里多索羅門ECC |
BarcodeEncoding.PDF417 | 2D | 堆疊(身份證,運輸) | 里多索羅門ECC |
除了速度外,限制格式集還作為驗證門:任何未列出的符號學的條碼即使在圖像中實際存在,也從結果中排除。
輸入
一個Code128運單(成功路徑)和一個不符合Code128唯一限制條件的QR碼(失敗路徑)。
shipping-label.png(成功路徑 — Code128符合限制)
qr-format-mismatch.png(失敗路徑 — QR由Code128唯一過濾器拒絕)
:path=/static-assets/barcode/content-code-examples/how-to/checksum-and-format-validation/format-constrained.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}");
}
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
輸出
成功路徑
運單的值是SHIP-2024-00438。 受限讀取直接拾取它,因為Code128符合過濾器期望,而廣泛讀取在所有格式中證實同一結果。
失敗路徑
來自受限讀取的空結果是一個驗證信號,而不是錯誤; 記錄該不一致以便審查。
對混合條碼型別的管道(例如,一個包括EAN-13產品程式碼和Code128追蹤號的包裝單),結合預期格式:
:path=/static-assets/barcode/content-code-examples/how-to/checksum-and-format-validation/multi-format-combine.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
};
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
}
每個返回的BarcodeResult.BarcodeType識別被解碼的格式,支持下游路由。
哪些符號學支持校驗和驗證?
並不是所有條碼格式都以同樣的方式使用校驗和。 下表將常見符號學映射到其錯誤檢測特性,這說明如何積極地設置RemoveFalsePositive為每種格式:
| 符號學 | 校驗和型別 | 強制的? | 建議 |
|---|---|---|---|
| EAN-13 / EAN-8 | Mod10 | 是的 | 預設設置足夠;始終執行校驗和 |
| UPC-A / UPC-E | Mod10 | 是的 | 預設設置足夠;檢查位在寫入時自動糾正 |
| Code128 | 加權Mod103 | 是的 | 預設設置足夠;按照規範強制執行 |
| Code39 | Mod43 | 可選 | 提升ConfidenceThreshold到0.8+並啟用RemoveFalsePositive |
| Codabar | Mod16 | 可選 | 與Code39相同;使用自信心作為質量門 |
| ITF | Mod10 | 可選 | 啟用RemoveFalsePositive對交錯格式 |
| QRCode / DataMatrix | 里多索羅門ECC | 始終 | 結構錯誤校正;不需要額外配置 |
| PDF417 | 里多索羅門ECC | 始終 | 與QR/DataMatrix相同;錯誤校正是固有的 |
對於如QR、DataMatrix和PDF417的2D符號學,錯誤校正在編碼結構中整合。 這些格式可以從部分損壞中恢復,而不依賴於簡單的校驗位。 ConfidenceThreshold仍然適用於ML檢測階段,而解碼步驟受益於符號學的內建冗餘。
現在這兩種技術都已理解,讓我們將它們結合成一個單一的生產就緒驗證模式。
如何將校驗和與格式限制結合?
生產就緒模式在一個Speed。 它們共同形成一個分層門:格式限制縮小搜索空間,校驗和驗證確保資料完整性,信心閾值對邊際解碼進行過濾,錯報刪除增加了次級驗證通過。
輸入
pos-scans/目錄中的三個POS掃描條碼被用作成功路徑:兩個EAN-13和一個UPC-A。 一個Code128倉庫架標籤用作失敗路徑 — EAN-13/UPC-A限制拒絕它並記錄REJECT行。
pos-scan-1.png(成功)
pos-scan-2.png(成功)
pos-scan-3.png(成功)
warehouse-rack.png(失敗 — Code128 被拒絕)
:path=/static-assets/barcode/content-code-examples/how-to/checksum-and-format-validation/combined-validation.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}");
}
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
輸出
成功路徑
所有三個POS掃描圖像均成功通過。 讀取器返回012345678905的值。 每個都匹配EAN13| UPCA| UPCE過濾器,具有有效的Mod10校驗和,並且信心高於0.8。
失敗路徑
將MinScanLines設置為3增加1D條碼有效所需的一致掃描線的最小數量; 預設值是2。提高此數值降低了來自噪聲掃描線的幽靈讀取風險,但可能導致錯過細或部分受損的條碼。 在零售POS環境中,使用乾淨的印刷標籤,數值3是一個保守的選擇,增強驗證而不影響吞吐量。
讀取後的ReadingSpeed.Faster適合乾淨的機器印刷標籤; ExtremeDetail在掃描時間更長的情況下恢復受損或光照不足的條碼。
我的下一步是什麼?
本文介紹了IronBarcode的隱含校驗和驗證模型、格式受限讀取的MinScanLines作為層次質量門的綜合驗證模式。
要進一步閱讀,請探索這些資源:
- IronBarcode教程 — 條碼讀取,提供端到端的讀取演練。
- 防止誤報,詳細說明
RemoveFalsePositive機制。 - 信心閾值範例,進行基於ML的檢測調整。
- 輸出資料格式,參考
BarcodeResult屬性。 - 圖像校正操作指南,介紹提高解碼準確性的過濾器。
- BarcodeReaderOptions API參考,提供完整的配置文件。
- BarcodeEncoding API參考,提供支持的符號學的完整清單。
常見問題
什麼是條碼校驗碼驗證?
條碼校驗碼驗證是一個確保條碼資料準確性的過程,通過將計算得出的校驗碼與條碼中編碼的值進行驗證。這有助於在掃描過程中檢測錯誤。
IronBarcode如何處理校驗碼驗證?
IronBarcode隱式地處理校驗碼驗證,通過計算條碼資料的校驗碼並將其與編碼校驗碼相比較,確保在掃描過程中的資料完整性。
什麼是BarcodeEncoding過濾器?
IronBarcode的BarcodeEncoding過濾器允許您指定在掃描中要讀取或忽略的條碼格式,通過專注於特定的條碼型別來實現更準確和有效的條碼處理。
IronBarcode可以進行組合驗證嗎?
是的,IronBarcode可以在掃描過程中通過檢查條碼的校驗碼和格式進行組合驗證,確保僅處理有效和格式正確的條碼。
在C#中使用IronBarcode限制格式進行條碼讀取是否可行?
是的,IronBarcode允許您通過指定要包括或排除的格式來限制條碼讀取,確保您的應用程式僅處理相關的條碼型別。
為什麼格式感知讀取在條碼處理中很重要?
格式感知讀取很重要,因為它允許您的應用程式僅處理特定型別的條碼,通過忽略不相關或不支持的條碼格式來提高速度和準確性。
如何在IronBarcode中實現格式感知讀取?
要在IronBarcode中實現格式感知讀取,使用BarcodeEncoding過濾器指定您希望讀取的條碼格式。這可以通過該程式庫的API完成,允許對條碼掃描要求進行精確控制。
使用IronBarcode進行條碼驗證有哪些好處?
IronBarcode在條碼驗證中提供幾個好處,包括強大的校驗碼驗證、格式感知讀取以及處理多種條碼標準的能力,確保條碼處理的高準確性和靈活性。
將IronBarcode實現於專案中需要什麼程式設計技能?
基本的C#程式設計知識足以將IronBarcode實現於專案中,因為它提供了簡單的方法和全面的文件來指導開發者。
IronBarcode適合於小型專案和大型企業應用嗎?
IronBarcode設計為可擴展且多功能,使其適合小型專案和需要強大條碼解決方案的大型企業應用。

