2009-08-07 84 views
0

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

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

回答

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

+0

这似乎比我上面的想法更紧密,但似乎只能达到24未来几年有3个字符。我是否认错了什么? – 2009-08-07 15:01:25

+0

是的......对于每个角色,时间上升到96倍。因此,例如8个角色会给我们:96^7天= 205876021399年。所以它认为这是未来的证明; ^) – Toad 2009-08-07 15:02:33

+0

更好地形象化它......它就像十进制使用基地10.十六进制使用基地16.这种方法使用基地96(96可打印ascii字符)。所以计数就像这样a,b,c,..... aa,ab,ac,ad,ae ........ ba,bb,bc,bd,.... ..... 。aaa,aab,aac,aad等 – Toad 2009-08-07 15:04:15

3

使用日期本身进行编码:01/01/2009是一个完全可以接受的条形码在Code39样式条形码下。

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

基本上你会在条形码中编码像“01012009”之类的东西,然后让解码过程只读取前两个数字作为月份,接下来的两个数字作为当天,最后4个作为一年。由于它们是直接的ascii,它将在没有任何真正的难处理的情况下工作。

第二种选择是将01-Jan-2009作为您的“0”日期,然后对自此之后的天数进行编码。解码过程将读取该数字,然后将该多天添加到1/1/09。这将工作,2009年1月5日将被编码为“4”,然后当你想读回日期时,你会增加4到09年1月1日,以获得2009年1月5日。

+3

如果使用8位数字日期存储,将其存储为yyyymmdd以使其可读性,可排序性和防错性达到最佳状态9999 – Hardryv 2009-08-07 15:14:32