ScannerBase クラスには、受信データをデコードするために DecodeDataLabel と DecodeScanDataType の 2 つのメソッドが用意されています。 これらのメソッドは、それぞれ、ScanDataLabel および ScanDataType プロパティがアクセスされると呼び出されます。 ScannerBase クラスは、アプリケーションがデータのプロパティにアクセスするまで待ってからデータをデコードし、デコードされたデータは将来の読み取りのためにキャッシュされます。
ScannerBase クラスは、Unified Point Of Service (UnifiedPOS) の仕様で要求されている ScannerBase.DecodeData 属性を実装しています。 アプリケーションが ScanDataLabel プロパティを読み取るときに DecodeData が true に設定されていない場合は、空のバイト配列が返されます。 同様に、ScanDataType は BarCodeSymbology.Unknown を返します。 この機能は ScannerBase クラスで実装されており、アプリケーションとサービス オブジェクトの両方に対して透過的です。
DecodeScanDataLabel を実装するには
ScannerBasic の保護された仮想メンバー DecodeScanDataLabel をオーバーライドします。
DecodeScanData は、完全なデータ バッファーを含む引数 scanData を受け取ります。 サービス オブジェクトのコードで追加のデータをキャッシュする必要はありません。
DecodeScanData では、スキャンされたデータを処理して、データ バッファーの最初と最後にあるヘッダーと種類の情報を削除する必要があります。 変更されたバッファーはバイト配列で返されます。
DecodeScanDataType を実装するには
ScannerBasic の保護された仮想メンバー DecodeScanDataType をオーバーライドします。
DecodeScanDataLabel と同様に、DecodeScanDataType はスキャンされた完全なバッファーを含む引数を受け取ります。
DecodeScanDataType は、バッファーを調べてスキャンされたデータの種類を確認し、適切な BarCodeSymbology 値を返します。
例
次のコードでは、スキャンされたバッファーからラベルとデータ値を抽出するためにサービス オブジェクトの開発者が実装できる一般的な方法を示します。 このコードは、特定のデバイスの例であることに注意してください。 サービス オブジェクトが異なると、デバイス固有のデコードが必要になります。
// 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 の仕様をご覧ください。
コードのコンパイル
- サービス オブジェクト プロジェクトの作成とコンパイルについて詳しくは、「サービス オブジェクトのサンプル: はじめに」をご覧ください。
参照
リファレンス
その他の参照情報
.NET