0

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

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

2 回答 2

3

使用日期本身: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 日。

于 2009-08-07T14:40:46.263 回答
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 个字符。

于 2009-08-07T14:45:38.547 回答