共用方式為


資料解碼(POS for .NET v1.14 SDK 說明文件)

ScannerBase 類別提供兩種方法, DecodeDataLabelDecodeScanDataType ,用於解碼輸入日期。 當存取 ScanDataLabelScanDataType 屬性時,會呼叫這些方法。 ScannerBase 類別會延遲資料解碼,直到應用程式存取資料屬性,且解碼後的資料會被快取以供未來讀取。

ScannerBase 類別依據統一服務點(UnifiedPOS)規範所要求實作該ScannerBase.DecodeData屬性。 若應用程式讀取 ScanDataLabel 屬性時 DecodeData 未設為 true,則會回傳一個空的位元組陣列。 同樣地, ScanDataType 回傳 BarCodeSymbology.Unknown。 此功能由 ScannerBase 類別實作,對應用程式與服務物件皆透明。

實作 DecodeScanDataLabel

  1. 覆寫受保護的虛擬 ScannerBasic 成員 DecodeScanDataLabel

  2. DecodeScanData 會接收一個參數 scanData,該參數包含完整的資料緩衝區。 服務物件程式碼中無需快取任何額外資料。

  3. DecodeScanData 應處理掃描資料,移除資料緩衝區開頭與結尾的標頭與類型資訊。 修改後的緩衝區會以位元組陣列形式回傳。

實作函數 DecodeScanDataType

  1. 覆寫受保護的虛擬 ScannerBasic 成員 DecodeScanDataType

  2. DecodeScanDataLabel 類似, DecodeScanDataType 會接收包含完整掃描緩衝區的參數。

  3. DecodeScanDataType 會檢查緩衝區以找出掃描資料的資料類型,並回傳相應的 BarCodeSymbology 值。

Example

以下程式碼示範了服務物件開發者可實作的典型方法,以從掃描的緩衝區中擷取標籤與資料值。 請注意,此程式碼是示範特定裝置的。 不同的服務物件需要特定裝置的解碼。

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

關於如何從掃描資料緩衝區擷取標籤與類型資料的更多細節,請參閱 UPOS 規範。

編譯程式碼

另請參閱

Reference

其他資源