Antecedentes: 3 de 9 Alfabeto de código de barras
Uma sintaxe simples para 3 de 9 códigos de barras
Qual é a fórmula por trás do alfabeto e dígitos em um código de barras 3 de 9?
Por exemplo, o ASCII tem um arranjo relativamente claro. Os números começam em 33, maiúsculas em 65 e minúscula em 97. A partir desses pontos de partida, você pode deduzir o código ASCII para qualquer número ou letra. O ponto inicial de cada intervalo também é um múltiplo de 32 + 1.
Os códigos de barras parecem aleatórios e sem sequência. Se usarmos a sintaxe do segundo link, esses serão os primeiros seis caracteres em 3 de 9:
A 100-01
B 010-01
C 110-00
D 001-01
E 101-00
F 011-00
Não vejo nenhum padrão aqui; O que é isso? Estou tão interessado no padrão pretendido pelo designer por trás deles quanto em alguém que cria um algoritmo próprio que pode fornecer o código acima para um determinado caractere com base em sua sequência.
Eu lutei com onde colocar essa pergunta; é história, ciência da computação, ciência da informação? Escolhi os programadores porque uma pesquisa no StackExchange teve o maior número de ocorrências de códigos de barras aqui e porque eu queria relacioná-lo especificamente com o ASCII para explicar que tipo de fórmula / explicação eu estou procurando.
Atualizar
Para os curiosos, aqui está a lista completa de todos os caracteres básicos no Código 39: http://jsfiddle.net/b9chris/LnX2e/2/
(as linhas de origem são retiradas da minha biblioteca de código de barras C # )
Você notará que a sintaxe simplificada proposta pode confundir um pouco o problema, pois pode implicar que todo caractere é um número de 5 bits com uma posição de traço. Os 4 caracteres finais têm vários traços (grandes lacunas). Realmente, é melhor pensar nesses códigos como números de 9 bits que possuem os bits mais ímpares definidos como 0 para a maioria dos símbolos. Aqui estão eles como números de 9 bits: http://jsfiddle.net/b9chris/LnX2e/1/
fonte
Respostas:
Não sei se esta é a explicação correta, mas com base no que você postou: Os 3 primeiros bits são de 1 a 6 em binário reverso. O último dígito é 1 quando há um número ímpar de 1s nos primeiros 3 (4?) Bits, portanto esse é provavelmente um bit de paridade.
fonte
O padrão certo para pensar como essa codificação funciona é que 1) você encontra um conjunto de "seqüências de bits seguras" e, em seguida, 2) mapeia seus caracteres para essas sequências.
O resultado final parece uma ordem aleatória, mas cada uma dessas etapas é bastante lógica por si só.
Seqüências de bits "seguras" são tais que, se você inverter um único bit, o resultado será "fora" do seu conjunto. Essa é uma forma de verificação de erro - basicamente um dos principais "pontos de venda" do Código 39.
00
e11
faça um conjunto de duas seqüências de bits seguras - quebre (inverta) um bit em qualquer uma dessas opções e você obterá um código inválido. Observe que o conjunto de01
e também10
é seguro.Para codificar três caracteres, é necessário mais de dois bits.
O exemplo de conjunto seguro para três caracteres é 000, 110 e 011.
Agora, você precisa codificar 39 caracteres.
Primeiro, encontre quantos bits você precisa para isso e, em seguida, encontre um conjunto de "seqüências de bits seguras".
E somente depois disso, mapeie seus personagens, como
first char -> first safe bit sequence
,second char -> second sequence
etc.Veja bem, é mais fácil pensar em termos de "etapas" aqui, não em termos de "fórmula".
O algoritmo para encontrar sequências de bits seguras para um determinado número de bits
N
pode ser o seguinte,2 power N
, inicialize seus elementos comtrue
0
- sua representação booleana éN
bits, cada zeroN
vezes: invertido um dos bits em 0 - que será "sequência de bits inseguro",marca elemento da matriz no índice resultante
false
matriz [1000], matriz [0100], matriz [0010], etc.
0
index na matriz em que o elemento étrue
,para a representação de bits desse índice, repita o mesmo loop acima:
inverta um dos bits e marque o respectivo elemento ("não seguro") da matriz
false
true
índice e assim por diante até a matriz terminarNo final, os elementos da matriz marcada
true
representam "sequências de bits seguras".Para transformar essas seqüências em código de barras, basta mapear pares de bits de maneira apropriada, como 00 - preto estreito, 01 - branco estreito, 10 - preto estreito, 10 - preto largo, 11 - branco largo .
fonte
A página da Wikipedia que você vincula menciona que
Como referência, cita as memórias de David Allais:
Assim, com isso em mente, podemos identificar as barras e espaços marcados e um padrão surge:
Observe que as barras
0
da primeira seção correspondem às10
outras três seções. Se girarmos as barras a serem ordenadas40123
, o padrão que vemos éque é uma das maneiras óbvias de enumerar pares de 5 elementos.
Equivalentemente, se você nomear os bits
B1-S3-B2-S0-B3-S1-B4-S2-B0
da esquerda para a direita em sua representação e representar cada código comoSBB
índices, a sequência12..90AB..YZ-. *
se tornará010 020 021 030 031 032 040 041 042 043 110 120 ... 342 343
.fonte