Codifica uma data em um código de barras ASCII
Pergunta
Estou investigando a codificação de informações de data em um código de barras linear que deve ser o mais curto possível. Uma idéia que temos tido é codificar informações data em vez de usar os caracteres ASCII para os numerais de data.
- A data mais antiga a ser codificado é 01-JAN-2009
- A data deve ser codificado usando caracteres ASCII imprimíveis
Solução
Se apenas os assuntos de data (não o tempo):
Take the date to be encoded.
Subtract 1-1-2009 from it
Get the amount of elapsed days.
Para codificar este número como uma sequência de caracteres ASCII imprimível de ASCII (48-127) faça o seguinte
código pseudo:
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 ;
}
este modo de codificação é a mais densa. Desde que codifica até 96 dias no futuro em apenas 2 caracteres. 9216 dias, em 3 caracteres, 884736 dias em 4 caracteres.
Outras dicas
Use a data em si:. 01/01/2009 é um código de barras perfeitamente aceitável sob o código de barras estilo Code39
Se você não se importa um pouco de lógica de processamento durante a leitura, então você pode fazer coisas como remover o caractere "/" ou qualquer separador que você usa.
Basicamente você codificar algo como: "01012009" para o código de barras, e depois ter o processo de decodificação basta ler os dois primeiros números como o mês, nos próximos dois como o dia e a última 4 como o ano. Como eles são ascii reta que vai funcionar sem qualquer processamento realmente difícil.
A segunda alternativa é ter 01-Jan-2009 como sua data de "0" e, em seguida, basta codificar o número de dias desde então. Em que o processo de decodificação seria ler o número e, em seguida, acrescentar que muitos dias para 1/1/09. Isso funcionaria que, Jan / 5/2009 seria codificado como um "4", em seguida, quando você queria ler a data de volta para fora, você gostaria de acrescentar 4 a Jan / 9/1 para obter Jan / 09/05.