我正在研究将日期信息编码为线性条形码,该条形码必须尽可能短。我们的一个想法是编码日期信息,而不是使用ASCII字符作为日期数字。
答案 0 :(得分:3)
使用日期本身:01/01/2009是Code39风格条形码下完全可以接受的条形码。
如果您在阅读过程中不介意处理逻辑,那么您可以执行删除“/”或您使用的任何分隔符等操作。
基本上你会在条形码中编码类似“01012009”的东西,然后解码过程只读取前两个数字作为月份,接下来的两个作为日期,最后4个作为年份。因为它们是直的,所以它可以在没有任何真正的硬处理的情况下工作。
第二种方法是将2009年1月1日作为您的“0”日期,然后只编码自那时起的天数。解码过程将读取数字,然后将这几天添加到1/1/09。这将是有效的,2009年1月5日将被编码为“4”,然后当你想要阅读日期时,你将添加4月1日/ 1月09日获得1月/ 5月09日。
答案 1 :(得分:3)
如果只有日期(而不是时间):
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个字符。