2009-08-07 85 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