将日期编码为ASCII条形码

时间:2009-08-07 14:31:49

标签: date encoding barcode

我正在研究将日期信息编码为线性条形码,该条形码必须尽可能短。我们的一个想法是编码日期信息,而不是使用ASCII字符作为日期数字。

  1. 最早编码的日期是01-JAN-2009
  2. 日期必须使用可打印的ASCII字符进行编码

2 个答案:

答案 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个字符。