代码之家  ›  专栏  ›  技术社区  ›  Aidan Ryan

将日期编码为ASCII条形码

  •  0
  • Aidan Ryan  · 技术社区  · 16 年前

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

    1. 日期必须使用可打印的ASCII字符进行编码
    2 回复  |  直到 16 年前
        1
  •  3
  •   Stephen Wrighton    16 年前

    使用日期本身:2009年1月1日是Code39样式条形码下完全可接受的条形码。

    如果您不介意在读取过程中执行一些处理逻辑,那么您可以执行诸如删除“/”或您使用的任何分隔符之类的操作。

    基本上,你会将类似“01012009”的东西编码到条形码中,然后让解码过程只读取前两个数字作为月份,后两个数字作为日期,最后4个数字作为年份。因为它们是直接的ascii码,所以它不需要任何真正困难的处理就可以工作。

    第二种选择是将2009年1月1日作为“0”日期,然后只对此后的天数进行编码。此时解码过程将读取数字,然后将这几天添加到1/1/09。这样,2009年1月5日将被编码为“4”,然后当你想读出日期时,你需要在2009年1月1日加上4,得到2009年1月5日。

        2
  •  3
  •   Toad    16 年前

    如果只有日期(而不是时间)重要:

     Take the date to be encoded.
     Subtract 1-1-2009 from it
     Get the amount of elapsed days.
    

    伪代码:

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

    推荐文章