資料解碼 (POS for .NET v1.14 SDK 文件)
ScannerBase 類別提供兩種方法:DecodeDataLabel 和 DecodeScanDataType 來解碼傳入日期。 分別存取 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 規格。
編譯程式碼
- 如需建立和編譯服務物件專案的其他資訊,請參閱服務物件範例:使用者入門。