Date 将日期编码为ASCII条形码

Date 将日期编码为ASCII条形码,date,encoding,barcode,Date,Encoding,Barcode,我正在研究将日期信息编码成一个线性条形码,该条形码必须尽可能短。我们的一个想法是对日期信息进行编码,而不是使用ASCII字符作为日期数字 最早的编码日期为2009年1月1日 日期必须使用可打印的ASCII字符进行编码 使用日期本身:2009年1月1日是Code39样式条形码下完全可接受的条形码 如果您不介意在读取过程中执行一些处理逻辑,那么您可以执行诸如删除“/”或您使用的任何分隔符之类的操作 基本上,你会将类似“01012009”的东西编码到条形码中,然后让解码过程只读取前两个数字作为月份,后

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

  • 最早的编码日期为2009年1月1日
  • 日期必须使用可打印的ASCII字符进行编码

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

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

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

    要将此数字编码为可打印的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个字符。

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

    要将此数字编码为可打印的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个字符。

    这似乎比我上面的想法更严格,但似乎只有3个字符才能达到未来24年。我是不是觉得有什么不对?是的。。。每个字符的时间都会增加96倍。例如,8个字符会给我们:96^7天=205876021399年。因此,它认为这是未来的证明;^)为了更好地想象它。。。这就像十进制用10为基数一样。十六进制使用基数16。此方法使用base 96(96个可打印的ascii字符)。所以计数是这样的a,b,c,。。。。。aa、ab、ac、ad、ae…….ba、bb、bc、bd。。。。。。aaa、aab、aac、aad等,为未来的访客提供以下答案:“X日起的天数”编码容易受到闰年问题的影响!为什么是闰年问题?你能详细说明一下吗?如果基准日期(2009年1月1日)不变。那么这个日期之后的X天将始终是相同的日期。还是我遗漏了什么?这似乎比我上面的想法更紧密,但似乎只有在未来的24年里才有3个字符。我是不是觉得有什么不对?是的。。。每个字符的时间都会增加96倍。例如,8个字符会给我们:96^7天=205876021399年。因此,它认为这是未来的证明;^)为了更好地想象它。。。这就像十进制用10为基数一样。十六进制使用基数16。此方法使用base 96(96个可打印的ascii字符)。所以计数是这样的a,b,c,。。。。。aa、ab、ac、ad、ae…….ba、bb、bc、bd。。。。。。aaa、aab、aac、aad等,为未来的访客提供以下答案:“X日起的天数”编码容易受到闰年问题的影响!为什么是闰年问题?你能详细说明一下吗?如果基准日期(2009年1月1日)不变。那么这个日期之后的X天将始终是相同的日期。或者我遗漏了什么?如果使用8位日期存储,则最好将其存储为yyyymmdd SOA,以使其在9999年具有可读性、可排序性和防错性。如果使用8位日期存储,则最好将其存储为yyyymmdd SOA,以使其在9999年具有可读性、可排序性和防错性