Freigeben über


Datendecodierung (POS für .NET v1.14 SDK-Dokumentation)

Die ScannerBase-Klasse stellt zwei Methoden bereit, DecodeDataLabel und DecodeScanDataType, um eingehende Daten zu decodieren. Diese Methoden werden aufgerufen, wenn auf die Eigenschaften ScanDataLabel bzw . ScanDataType zugegriffen wird. Die ScannerBase-Klasse stellt die Datencodierung so lange zurück, bis die Anwendung auf die Dateneigenschaften zugreift, und die decodierten Daten werden dann für zukünftige Lesevorgänge zwischengespeichert.

Die ScannerBase-Klasse implementiert das ScannerBase.DecodeData-Attribut wie von der UnifiedPOS-Spezifikation (Unified Point Of Service) gefordert. Wenn DecodeData nicht auf true festgelegt ist, wenn die Anwendung die Eigenschaft ScanDataLabel liest, wird ein leeres Bytearray zurückgegeben. In ähnlicher Weise gibt ScanDataTypeBarCodeSymbology.Unknown zurück. Diese Funktionalität ist in der ScannerBase-Klasse implementiert und sowohl für die Anwendung als auch für das Dienstobjekt transparent.

So implementieren Sie DecodeScanDataLabel

  1. Setzen Sie den geschützten, virtuellen ScannerBasic-Member DecodeScanDataLable außer Kraft.

  2. DecodeScanData akzeptiert das Argument scanData, das den vollständigen Datenpuffer enthält. Es ist nicht erforderlich, zusätzliche Daten im Dienstobjektcode zwischenzuspeichern.

  3. DecodeScanData sollte die gescannten Daten verarbeiten, um Header- und Typinformationen am Anfang und Ende des Datenpuffers zu entfernen. Der geänderte Puffer wird in einem Bytearray zurückgegeben.

So implementieren Sie DecodeScanDataType

  1. Setzen Sie den geschützten, virtuellen ScannerBasic-Member DecodeScanDataType außer Kraft.

  2. Wie DecodeScanDataLabel empfängt DecodeScanDataType ein Argument, das den vollständigen gescannten Puffer enthält.

  3. DecodeScanDataType untersucht den Puffer, um den Datentyp der gescannten Daten zu ermitteln, und gibt den entsprechenden BarCodeSymbology-Wert zurück.

Beispiel

Der folgende Code demonstriert eine typische Methode, die der Serviceobjektentwickler implementieren könnte, um Bezeichnungs- und Datenwerte aus einem gescannten Puffer zu extrahieren. Beachten Sie, dass dieser Code nur für ein bestimmtes Gerät repräsentativ ist. Andere Dienstobjekte erfordern eine gerätespezifische Decodierung.

// Decode the incoming scanner data, removing header and
// type information.
override protected byte[] DecodeScanDataLabel(
                byte[] scanData)
{
    int i;
    int len = 0;

    // Get length of label data.
    for (i = 5; i < (int)scanData[1]
                && (int)scanData[i] > 31; i++)
    {
        len++;
    }

    // Copy label data into buffer.
    byte[] label = new byte[len];
    len = 0;

    for (i = 5; i < (int)scanData[1]
                && (int)scanData[i] > 31; i++)
    {
        label[len++] = scanData[i];
    }

    return label;
}

// Process the incoming scanner data to find the data type.
override protected BarCodeSymbology DecodeScanDataType(
                byte[] scanData)
{
    int i;

    for (i = 5; i < (int)scanData[1]
                && (int)scanData[i] > 31; i++)
    {
    }

    // last 3 (or 1) bytes indicate symbology.
    if (i + 2 <= (int)ScanData[1])
    {
        return GetSymbology(
                ScanData[i],
                ScanData[i + 1],
                ScanData[i + 2]);
    }
    else
    {
        return GetSymbology(ScanData[i], 0, 0);
    }
}

// This method determines the data type by examining
// the end of the scanned data buffer. Either 1 byte
// or 3 byte is used to determine the type, depending on
// the incoming buffer.
static private BarCodeSymbology GetSymbology(
            byte b1,
            byte b2,
            byte b3)
{
    if (b1 == 0 && b3 == 11)
    {
        // Use all 3 bytes to determine the date type.
        switch (b2)
        {
            case 10:
                return BarCodeSymbology.Code39;
            case 13:
                return BarCodeSymbology.Itf;
            case 14:
                return BarCodeSymbology.Codabar;
            case 24:
                return BarCodeSymbology.Code128;
            case 25:
                return BarCodeSymbology.Code93;
            case 37:
                return BarCodeSymbology.Ean128;
            case 255:
                return BarCodeSymbology.Rss14;
            default:
                break;
        }

    }
    else if (b2 == 0 && b3 == 0)
    {
        // Only use the first byte to determine the data type.
        switch (b1)
        {
            case 13:
                return BarCodeSymbology.Upca;
            case 22:
                return BarCodeSymbology.EanJan13;
            case 12:
                return BarCodeSymbology.EanJan8;
            default:
                break;
        }
    }

    return BarCodeSymbology.Other;
}

Weitere Details dazu, wie Bezeichnungs- und Typdaten aus einem gescannten Datenpuffer extrahiert werden sollten, finden Sie in der UPOS-Spezifikation.

Kompilieren des Codes

Weitere Informationen

Verweis

Weitere Ressourcen