我正在研究将日期信息编码为必须尽可能短的线性条形码。我们有一个想法是编码日期信息,而不是使用日期数字的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