如何在C#中驗證條碼校驗和並使用格式感知讀取

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

條碼校驗和有助於檢測替換錯誤。 例如,在一個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)
$vbLabelText   $csharpLabel

如何驗證條碼校驗和?

IronBarcode根據每個符號學的規範在解碼過程中驗證校驗和。 例如,當讀取一個EAN-13條碼時,Mod10校驗位是從前12位計算出來的並與第13位進行比對。 如果數字不匹配,則條碼被默默拒絕,不會出現在BarcodeResults集中。 此方法適用於所有具有強制校驗位的格式,包括UPC-A、UPC-E、EAN-8、Code128、ITF和其他格式。

這種隱含模式不同於那些顯示顯式切換的程式庫。 下表比較了兩種方法:

校驗和驗證模型比較:IronBarcode vs. Aspose.BarCode
方面IronBarcodeAspose.BarCode
驗證觸發自動;每次解碼時運行Explicit: ChecksumValidation.On / Off / Default
需要的開發者操作無;無效條碼從結果中排除在讀取之前設置BarcodeSettings.ChecksumValidation
禁用校驗和不公開;強制格式的校驗和始終執行是的;ChecksumValidation.Off跳過驗證
可選校驗和格式(Code39)使用Confidence + RemoveFalsePositive來過濾低質量讀取顯式啟用Enable校驗和.是的
失敗行為條碼在結果中默默被忽略條碼可能會出現一個單獨的校驗和值進行手動檢查

對於具有可選校驗和的符號學,如Code39,程式庫使用信心評分和RemoveFalsePositive而不是校驗和切換。

輸入

一個Code128倉庫架標籤(成功路徑)和一個空白無條碼的圖片(失敗路徑)。

編碼 RACK-A1-LOT-7382 的 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
$vbLabelText   $csharpLabel

輸出

成功路徑

主控台輸出顯示Code128 RACK-A1-LOT-7382被解碼,品質高於信心閾值

倉庫架條碼在頁面0上顯示為BarcodeResults中。

失敗路徑

主控台輸出顯示WARN未找到有效條碼的空白圖片輸入

ConfidenceThreshold從其0.7的預設值提高,進一步加強此門限,對於如Code39的可選校驗和符號學。

在涵蓋校驗和驗證後,下一步是將讀取器限制到您的管道所期望的條碼格式。


如何使用格式感知條碼讀取?

BarcodeEncoding枚舉是一個標誌型別,允許使用按位或運算符組合多個格式。 設置ExpectBarcodeTypes將讀取限制在這些格式上,並跳過其他格式的檢測。

常見的BarcodeEncoding值
類別描述校驗和
BarcodeEncoding.All後設所有支持的格式(預設行為)每格式
BarcodeEncoding.AllOneDimensional後設所有線性(1D)格式,包括堆疊的每格式
BarcodeEncoding.AllTwoDimensional後設所有矩陣/網格(2D)格式每格式
BarcodeEncoding.Code1281D高密度字母數字(物流,運輸)強制(加權Mod103)
BarcodeEncoding.EAN131D零售產品識別,13位數字強制(Mod10)
BarcodeEncoding.QRCode2D高容量矩陣(URL,結構化資料)里多索羅門ECC
BarcodeEncoding.Code391D字母數字(國防,汽車)可選(Mod43)
BarcodeEncoding.UPCA1D北美零售,12位數字強制(Mod10)
BarcodeEncoding.DataMatrix2D緊湊矩陣(電子,製藥)里多索羅門ECC
BarcodeEncoding.PDF4172D堆疊(身份證,運輸)里多索羅門ECC

除了速度外,限制格式集還作為驗證門:任何未列出的符號學的條碼即使在圖像中實際存在,也從結果中排除。

輸入

一個Code128運單(成功路徑)和一個不符合Code128唯一限制條件的QR碼(失敗路徑)。

編碼 SHIP-2024-00438 的 Code128 條碼,用作出貨標籤的輸入

shipping-label.png(成功路徑 — Code128符合限制)

作為僅限 Code128 之受限讀取中格式不符失敗路徑的 QR 碼

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
$vbLabelText   $csharpLabel

輸出

成功路徑

主控台輸出顯示受限讀取找到1個Code128條碼和廣泛讀取證實它

運單的值是SHIP-2024-00438。 受限讀取直接拾取它,因為Code128符合過濾器期望,而廣泛讀取在所有格式中證實同一結果。

失敗路徑

主控台輸出顯示對QR碼圖像返回0結果的受限讀取

來自受限讀取的空結果是一個驗證信號,而不是錯誤; 記錄該不一致以便審查。

對混合條碼型別的管道(例如,一個包括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
}
$vbLabelText   $csharpLabel

每個返回的BarcodeResult.BarcodeType識別被解碼的格式,支持下游路由。

哪些符號學支持校驗和驗證?

並不是所有條碼格式都以同樣的方式使用校驗和。 下表將常見符號學映射到其錯誤檢測特性,這說明如何積極地設置RemoveFalsePositive為每種格式:

符號學的校驗和特性
符號學校驗和型別強制的?建議
EAN-13 / EAN-8Mod10是的預設設置足夠;始終執行校驗和
UPC-A / UPC-EMod10是的預設設置足夠;檢查位在寫入時自動糾正
Code128加權Mod103是的預設設置足夠;按照規範強制執行
Code39Mod43可選提升ConfidenceThreshold到0.8+並啟用RemoveFalsePositive
CodabarMod16可選與Code39相同;使用自信心作為質量門
ITFMod10可選啟用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行。

EAN-13 barcode encoding 5901234123471 used as POS scan input 1

pos-scan-1.png(成功)

EAN-13 barcode encoding 4006381333931 used as POS scan input 2

pos-scan-2.png(成功)

UPC-A barcode encoding 012345678905 used as POS scan input 3

pos-scan-3.png(成功)

編碼 RACK-A1-LOT-7382 的 Code128 條碼,用作組合驗證失敗路徑的輸入

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
$vbLabelText   $csharpLabel

輸出

成功路徑

主控台輸出顯示所有3個POS掃描條碼已被接受,狀態為OK並顯示解碼值

所有三個POS掃描圖像均成功通過。 讀取器返回012345678905的值。 每個都匹配EAN13| UPCA| UPCE過濾器,具有有效的Mod10校驗和,並且信心高於0.8。

失敗路徑

主控台輸出顯示倉庫架Code128條碼被EAN-13/UPC-A過濾器拒絕

MinScanLines設置為3增加1D條碼有效所需的一致掃描線的最小數量; 預設值是2。提高此數值降低了來自噪聲掃描線的幽靈讀取風險,但可能導致錯過細或部分受損的條碼。 在零售POS環境中,使用乾淨的印刷標籤,數值3是一個保守的選擇,增強驗證而不影響吞吐量。

讀取後的ReadingSpeed.Faster適合乾淨的機器印刷標籤; ExtremeDetail在掃描時間更長的情況下恢復受損或光照不足的條碼。


我的下一步是什麼?

本文介紹了IronBarcode的隱含校驗和驗證模型、格式受限讀取的MinScanLines作為層次質量門的綜合驗證模式。

要進一步閱讀,請探索這些資源:

獲取免費試用授權以在現場環境中測試每一個功能,或者當管道準備好生產時,查看授權選項

常見問題

什麼是條碼校驗碼驗證?

條碼校驗碼驗證是一個確保條碼資料準確性的過程,通過將計算得出的校驗碼與條碼中編碼的值進行驗證。這有助於在掃描過程中檢測錯誤。

IronBarcode如何處理校驗碼驗證?

IronBarcode隱式地處理校驗碼驗證,通過計算條碼資料的校驗碼並將其與編碼校驗碼相比較,確保在掃描過程中的資料完整性。

什麼是BarcodeEncoding過濾器?

IronBarcode的BarcodeEncoding過濾器允許您指定在掃描中要讀取或忽略的條碼格式,通過專注於特定的條碼型別來實現更準確和有效的條碼處理。

IronBarcode可以進行組合驗證嗎?

是的,IronBarcode可以在掃描過程中通過檢查條碼的校驗碼和格式進行組合驗證,確保僅處理有效和格式正確的條碼。

在C#中使用IronBarcode限制格式進行條碼讀取是否可行?

是的,IronBarcode允許您通過指定要包括或排除的格式來限制條碼讀取,確保您的應用程式僅處理相關的條碼型別。

為什麼格式感知讀取在條碼處理中很重要?

格式感知讀取很重要,因為它允許您的應用程式僅處理特定型別的條碼,通過忽略不相關或不支持的條碼格式來提高速度和準確性。

如何在IronBarcode中實現格式感知讀取?

要在IronBarcode中實現格式感知讀取,使用BarcodeEncoding過濾器指定您希望讀取的條碼格式。這可以通過該程式庫的API完成,允許對條碼掃描要求進行精確控制。

使用IronBarcode進行條碼驗證有哪些好處?

IronBarcode在條碼驗證中提供幾個好處,包括強大的校驗碼驗證、格式感知讀取以及處理多種條碼標準的能力,確保條碼處理的高準確性和靈活性。

將IronBarcode實現於專案中需要什麼程式設計技能?

基本的C#程式設計知識足以將IronBarcode實現於專案中,因為它提供了簡單的方法和全面的文件來指導開發者。

IronBarcode適合於小型專案和大型企業應用嗎?

IronBarcode設計為可擴展且多功能,使其適合小型專案和需要強大條碼解決方案的大型企業應用。

Darrius Serrant
全端軟體工程師(WebOps)

Darrius Serrant擁有邁阿密大學的電腦科學學士學位,並在Iron Software擔任全端WebOps行銷工程師。從小就對程式設計有興趣,他認為計算既神秘又易於理解,成為創意和問題解決的完美媒介。

在Iron Software,Darrius喜歡創造新事物並簡化複雜的概念,使其更易於理解。作為我們的常駐開發人員之一,他還志願教學,將他的專業知識傳授給下一代。

對Darrius來說,他的工作是有意義的,因為它有價值且對社會有真正的影響。

準備好開始了嗎?
Nuget 下載 2,317,217 | 版本: 2026.7 剛剛發布
Still Scrolling Icon

還在滾動嗎?

想快速驗證嗎? PM > Install-Package BarCode
運行範例觀看您的字串成為條碼。