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.

  1. A data mais antiga a ser codificado é 01-JAN-2009
  2. A data deve ser codificado usando caracteres ASCII imprimíveis
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top