我正在研究將日期信息編碼爲必須儘可能短的線性條形碼。我們有一個想法是編碼日期信息,而不是使用日期數字的ASCII字符。將日期編碼爲ASCII條形碼
- 進行編碼的最早日期是01-JAN-2009
- 日期必須使用可打印的ASCII字符
我正在研究將日期信息編碼爲必須儘可能短的線性條形碼。我們有一個想法是編碼日期信息,而不是使用日期數字的ASCII字符。將日期編碼爲ASCII條形碼
如果僅日期事項(無時間):
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個字符。
使用日期本身進行編碼: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日。
如果使用8位數字日期存儲,將其存儲爲yyyymmdd以使其可讀性,可排序性和防錯性達到最佳狀態9999 – Hardryv 2009-08-07 15:14:32
這似乎比我上面的想法更緊密,但似乎只能達到24未來幾年有3個字符。我是否認錯了什麼? – 2009-08-07 15:01:25
是的......對於每個角色,時間上升到96倍。因此,例如8個角色會給我們:96^7天= 205876021399年。所以它認爲這是未來的證明; ^) – Toad 2009-08-07 15:02:33
更好地形象化它......它就像十進制使用基地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