我正在研究将日期信息编码为必须尽可能短的线性条形码。我们的一个想法是对日期信息进行编码,而不是使用 ASCII 字符作为日期数字。
- 最早被编码的日期是 01-JAN-2009
- 日期必须使用可打印的 ASCII 字符进行编码
使用日期本身:01/01/2009 是 Code39 样式条码下完全可接受的条码。
如果您在读取过程中不介意一些处理逻辑,那么您可以执行诸如删除“/”或您使用的任何分隔符之类的操作。
基本上,您会将“01012009”之类的内容编码到条形码中,然后让解码过程读取前两个数字作为月份,接下来的两个数字作为日期,最后 4 个数字作为年份。由于它们是直接的 ascii,因此无需任何非常困难的处理即可工作。
第二种选择是将 2009 年 1 月 1 日作为您的“0”日期,然后仅编码此后的天数。解码过程将在其中读取数字,然后将那么多天添加到 09 年 1 月 1 日。这将起作用,2009 年 1 月 5 日将被编码为“4”,然后当您想读回日期时,您可以将 4 添加到 2009 年 1 月 1 日以获得 2009 年 1 月 5 日。
如果只有日期很重要(不是时间):
Take the date to be encoded.
Subtract 1-1-2009 from it
Get the amount of elapsed days.
要将此数字编码为可打印的 ascii 字符序列(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 天进行编码。9216 天,3 个字符,884736 天,4 个字符。