できるだけ短くする必要がある線形バーコードへの日付情報のエンコードを調査しています。私たちが思いついたアイデアの 1 つは、日付の数字に ASCII 文字を使用するのではなく、日付情報をエンコードすることです。
- エンコードされる最も古い日付は 01-JAN-2009 です
- 日付は、印刷可能な ASCII 文字を使用してエンコードする必要があります
日付自体を使用してください: 2009 年 1 月 1 日は、Code39 スタイルのバーコードで完全に受け入れられるバーコードです。
読み取り中に少し処理ロジックを気にしない場合は、「/」または使用する区切り文字を削除するなどの操作を行うことができます。
基本的に、「01012009」のようなものをバーコードにエンコードし、デコード プロセスで最初の 2 つの数字を月として、次の 2 つを日として、最後の 4 つを年として読み取ります。それらはストレートASCIIなので、本当に難しい処理をしなくても動作します。
2 つ目の方法は、2009 年 1 月 1 日を「0」の日付として、それ以降の日数をエンコードすることです。デコード プロセスで数字を読み取り、その日数を 1/1/09 に加算します。これは、2009 年 1 月 5 日が「4」としてエンコードされ、日付を読み戻したい場合は、4 を 1 月 1/09 に追加して 1 月 5/09 を取得することで機能します。
日付のみが重要な場合 (時間ではありません):
Take the date to be encoded.
Subtract 1-1-2009 from it
Get the amount of elapsed days.
この数値を印刷可能な一連の ascii chars (ascii 48-127) としてエンコードするには、次のようにします。
擬似コード:
const int ASCIILOWRANGE = 48
const int ASCIIHIGHRANGE = 126
const char ASCIIENDMARKER = 127;
String convertToAscii(int numberOfDays)
{
String output = "";
while(numberOfDays>0)
{
output += (char) ASCIILOWRANGE + numberOfDays % (ASCIIHIGHRANGE-ASCIILOWRANGE);
numberOfDays /= (ASCIIHIGHRANGE-ASCIILOWRANGE);
}
output += ASCIIENDMARKER ;
return output;
}
//decoder
int convertToDays(String ascii)
{
char rightmost;
int numberOfDays = 0;
while(ascii.length>0)
{
rightmost = ascii[0];
if(rightmost == ASCIIENDMARKER ) break; //ready
numberOfDays *= (rightmost - ASCIILOWRANGE) * (ASCIIHIGHRANGE-ASCIILOWRANGE);
ascii = ascii.substr(1); //remove rightmost char from string
}
return numberOfDays ;
}
このエンコード方法は最も高密度です。わずか 2 文字で最大 96 日先までエンコードされるためです。3 文字で 9216 日、4 文字で 884736 日。