Udostępnij za pośrednictwem


Dekodowanie danych (poS dla zestawu SDK platformy .NET w wersji 1.14)

Klasa ScannerBase udostępnia dwie metody: DecodeDataLabel i DecodeScanDataType na potrzeby dekodowania daty przychodzącej. Te metody są wywoływane, gdy uzyskuje się dostęp do właściwości ScanDataLabel i ScanDataType. Klasa ScannerBase dekoduje dekodowanie danych, dopóki aplikacja nie uzyska dostępu do właściwości danych, a zdekodowane dane zostaną buforowane na potrzeby przyszłych operacji odczytu.

Klasa ScannerBase implementuje atrybut ScannerBase.DecodeData zgodnie ze specyfikacją Unified Point Of Service (UnifiedPOS). Jeśli właściwość DecodeData nie jest ustawiona na true , gdy aplikacja odczytuje właściwość ScanDataLabel , zostanie zwrócona pusta tablica bajtów. Podobnie funkcja ScanDataType zwraca wartość BarCodeSymbology.Unknown. Ta funkcja jest implementowana w klasie ScannerBase i jest niewidoczna zarówno dla aplikacji, jak i obiektu usługi.

Aby zaimplementować decodeScanDataLabel

  1. Zastąpij chroniony element członkowski SkanerBasic DecodeScanDataLabel.

  2. DecodeScanData przyjmuje argument scanData, który zawiera pełny bufor danych. Nie ma potrzeby buforowania żadnych dodatkowych danych w kodzie obiektu usługi.

  3. DecodeScanData powinien przetworzyć zeskanowane dane, aby usunąć nagłówek i typ informacji na początku i na końcu buforu danych. Zmodyfikowany bufor zostanie zwrócony w tablicy bajtów.

Aby zaimplementować decodeScanDataType

  1. Zastąpij chroniony element członkowski SkanerBasic DecodeScanDataType.

  2. Podobnie jak DecodeScanDataLabel, DecodeScanDataType otrzymuje argument zawierający pełny zeskanowany bufor.

  3. DecodeScanDataType sprawdza bufor, aby znaleźć typ danych zeskanowanych danych i zwraca odpowiednią wartość BarCodeSymbology .

Przykład

Poniższy kod demonstruje typową metodę, która deweloper obiektu usługi może zaimplementować w celu wyodrębnienia etykiet i wartości danych ze zeskanowanego buforu. Należy pamiętać, że ten kod demonstruje określone urządzenie. Różne obiekty usługi będą wymagać dekodowania specyficznego dla urządzenia.

// 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;
}

Dodatkowe szczegóły dotyczące sposobu wyodrębniania danych etykiet i typów z zeskanowanego buforu danych można znaleźć w specyfikacji upOS.

Kompilowanie kodu

Zobacz też

Odwołanie

Inne zasoby