VintaSoft Barcode .NET SDK 16.0: Руководство для .NET разработчика
В этом разделе
Как использовать пользовательскую контрольную сумму в штрих-коде?
В этом разделе
VintaSoft Barcode .NET SDK позволяет указать метод, который проверяет и помечает найденный штрих-код как хороший или плохой штрих-код (свойство ReaderSettings.VerifyBarcodeMethod).

Вот пример C#/VB.NET кода, который показывает, как добавить пользовательскую контрольную сумму (с основанием 1000) в штрих-код Code 39 и проверить контрольную сумму при распознавании штрих-кода.
public static void TestCode39Barcode(string value)
{
    // create the barcode writer
    using (Vintasoft.Barcode.BarcodeWriter writer = new Vintasoft.Barcode.BarcodeWriter())
    {
        // set barcode writer settings
        writer.Settings.Barcode = Vintasoft.Barcode.BarcodeType.Code39;
        writer.Settings.Value = value;
        writer.Settings.ValueVisible = false;

        // get image of barcode without checksum
        using (Vintasoft.Imaging.VintasoftBitmap barcodeWithoutChecksumImage = writer.GetBarcodeAsVintasoftBitmap())
        {
            // set barcode writer settings
            writer.Settings.Value = value + GenerateChecksum(value);

            // get image of barcode with custom checksum
            using (Vintasoft.Imaging.VintasoftBitmap barcodeWithMyChecksumImage = writer.GetBarcodeAsVintasoftBitmap())
            {
                // create the barcode reader
                Vintasoft.Barcode.BarcodeReader reader = new Vintasoft.Barcode.BarcodeReader();

                // set barcode reader settings
                reader.Settings.ScanBarcodeTypes = Vintasoft.Barcode.BarcodeType.Code39;
                reader.Settings.MinConfidence = 100;
                reader.Settings.AutomaticRecognition = true;
                reader.Settings.ExpectedBarcodes = 1;

                // set delegate to a method that verifies the barcode value
                reader.Settings.VerifyBarcodeMethod = VerifyBarcodeMethod;

                // read barcodes from image of barcode without checksum - barcodes will not be found
                Vintasoft.Barcode.IBarcodeInfo[] infos = reader.ReadBarcodes(barcodeWithoutChecksumImage);
                System.Console.WriteLine("Scan (NoChecksum):");
                for (int i = 0; i < infos.Length; i++)
                    System.Console.WriteLine(infos[i].Value);

                // read barcodes from image of barcode with checksum - one barcode will be found
                infos = reader.ReadBarcodes(barcodeWithMyChecksumImage);
                System.Console.WriteLine("Scan (MyChecksum):");
                for (int i = 0; i < infos.Length; i++)
                    System.Console.WriteLine(infos[i].Value);
            }
        }
    }
}

/// <summary>
/// Generates the checksum at base 1000.
/// </summary>
static string GenerateChecksum(string value)
{
    int checkSum = 0;
    for (int i = 0; i < value.Length; i++)
    {
        checkSum += ((byte)value[i]) * i;
        checkSum %= 1000;
    }
    // result - [000..999]
    return checkSum.ToString().PadLeft(3, '0');
}

/// <summary>
/// Verifies the barcode value.
/// </summary>
static void VerifyBarcodeMethod(Vintasoft.Barcode.BarcodeReader reader, Vintasoft.Barcode.IBarcodeInfo barcodeInfo)
{
    if (TestChecksum(barcodeInfo.Value))
        barcodeInfo.Confidence = 100;
    else
        barcodeInfo.Confidence = 0;
}

/// <summary>
/// Tests checksum in barcode value.
/// </summary>
static bool TestChecksum(string barcodeValue)
{
    if (barcodeValue.Length < 4)
        return false;
    string value = barcodeValue.Substring(0, barcodeValue.Length - 3);
    string readChecksum = barcodeValue.Substring(barcodeValue.Length - 3);
    return readChecksum == GenerateChecksum(value);
}
Public Shared Sub TestCode39Barcode(value As String)
    ' create the barcode writer
    Using writer As New Vintasoft.Barcode.BarcodeWriter()
        ' set barcode writer settings
        writer.Settings.Barcode = Vintasoft.Barcode.BarcodeType.Code39
        writer.Settings.Value = value
        writer.Settings.ValueVisible = False

        ' get image of barcode without checksum
        Using barcodeWithoutChecksumImage As Vintasoft.Imaging.VintasoftBitmap = writer.GetBarcodeAsVintasoftBitmap()
            ' set barcode writer settings
            writer.Settings.Value = value & GenerateChecksum(value)

            ' get image of barcode with custom checksum
            Using barcodeWithMyChecksumImage As Vintasoft.Imaging.VintasoftBitmap = writer.GetBarcodeAsVintasoftBitmap()
                ' create the barcode reader
                Dim reader As New Vintasoft.Barcode.BarcodeReader()

                ' set barcode reader settings
                reader.Settings.ScanBarcodeTypes = Vintasoft.Barcode.BarcodeType.Code39
                reader.Settings.MinConfidence = 100
                reader.Settings.AutomaticRecognition = True
                reader.Settings.ExpectedBarcodes = 1

                ' set delegate to a method that verifies the barcode value
                reader.Settings.VerifyBarcodeMethod = AddressOf VerifyBarcodeMethod

                ' read barcodes from image of barcode without checksum - barcodes will not be found
                Dim infos As Vintasoft.Barcode.IBarcodeInfo() = reader.ReadBarcodes(barcodeWithoutChecksumImage)
                System.Console.WriteLine("Scan (NoChecksum):")
                For i As Integer = 0 To infos.Length - 1
                    System.Console.WriteLine(infos(i).Value)
                Next

                ' read barcodes from image of barcode with checksum - one barcode will be found
                infos = reader.ReadBarcodes(barcodeWithMyChecksumImage)
                System.Console.WriteLine("Scan (MyChecksum):")
                For i As Integer = 0 To infos.Length - 1
                    System.Console.WriteLine(infos(i).Value)
                Next
            End Using
        End Using
    End Using
End Sub

''' <summary>
''' Generates the checksum at base 1000.
''' </summary>
Private Shared Function GenerateChecksum(value As String) As String
    Dim checkSum As Integer = 0
    For i As Integer = 0 To value.Length - 1
        checkSum += CByte(AscW(value(i))) * i
        checkSum = checkSum Mod 1000
    Next
    ' result - [000..999]
    Return checkSum.ToString().PadLeft(3, "0"C)
End Function

''' <summary>
''' Verifies the barcode value.
''' </summary>
Private Shared Sub VerifyBarcodeMethod(reader As Vintasoft.Barcode.BarcodeReader, barcodeInfo As Vintasoft.Barcode.IBarcodeInfo)
    If TestChecksum(barcodeInfo.Value) Then
        barcodeInfo.Confidence = 100
    Else
        barcodeInfo.Confidence = 0
    End If
End Sub

''' <summary>
''' Tests checksum in barcode value.
''' </summary>
Private Shared Function TestChecksum(barcodeValue As String) As Boolean
    If barcodeValue.Length < 4 Then
        Return False
    End If
    Dim value As String = barcodeValue.Substring(0, barcodeValue.Length - 3)
    Dim readChecksum As String = barcodeValue.Substring(barcodeValue.Length - 3)
    Return readChecksum = GenerateChecksum(value)
End Function