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 値を返します。
Example
次のコードは、スキャンされたバッファーからラベルとデータ値を抽出するために Service Object 開発者が実装できる一般的な方法を示しています。 このコードは、特定のデバイスを示しています。 サービス オブジェクトが異なると、デバイス固有のデコードが必要になります。
// 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