Qual é a fórmula para o alfabeto de código de barras 3 de 9?

8

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/

Chris Moschini
fonte
Eu não li o wiki mas depois de ver o seu exemplo, eu diria que a próxima seria G 111-01
Pieter B
Infelizmente é G 000-11.
Chris Moschini

Respostas:

8

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.

Tolo
fonte
9

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.

  • Digamos, se você quiser "codificar" dessa maneira dois caracteres, precisará de pelo menos dois bits. 00e 11faç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 de 01e também 10é 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 sequenceetc.

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 Npode ser o seguinte,

  1. alocar matriz booleana de comprimento 2 power N, inicialize seus elementos comtrue
  2. comece com 0- sua representação booleana é Nbits, cada zero
  3. fazer Nvezes: 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.
  4. encontre next after 0index 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 matrizfalse
  5. encontre o próximo trueíndice e assim por diante até a matriz terminar

No final, os elementos da matriz marcada truerepresentam "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 .

mosquito
fonte
3

A página da Wikipedia que você vincula menciona que

Seu design original incluía duas barras largas e um amplo espaço em cada personagem, resultando em 40 caracteres possíveis.

Como referência, cita as memórias de David Allais:

Comecei a ilustrar um caractere de símbolo usando a lateral do giz para desenhar as barras largas. A estrutura de cinco barras e quatro espaços, incluindo duas barras largas e um amplo espaço, veio a mim em flash. Os dois dos cinco códigos nas barras forneceram dez combinações e o amplo espaço fornecido para quatro grupos separados.

Assim, com isso em mente, podemos identificar as barras e espaços marcados e um padrão surge:

  BSBSBSBSB     BB S
  001122334

0 000110100     23 1
1 100100001     04 1
2 001100001     14 1
3 101100000     01 1
4 000110001     24 1
5 100110000     02 1
6 001110000     12 1
7 000100101     34 1
8 100100100     03 1
9 001100100     13 1

A 100001001     04 2
B 001001001     14 2
C 101001000     01 2
D 000011001     24 2
E 100011000     02 2
F 001011000     12 2
G 000001101     34 2
H 100001100     03 2
I 001001100     13 2
J 000011100     23 2

K 100000011     04 3
L 001000011     14 3
M 101000010     01 3
N 000010011     24 3
O 100010010     02 3
P 001010010     12 3
Q 000000111     34 3
R 100000110     03 3
S 001000110     13 3
T 000010110     23 3

U 110000001     04 0
V 011000001     14 0
W 111000000     01 0
X 010010001     24 0
Y 110010000     02 0
Z 011010000     12 0
- 010000101     34 0
. 110000100     03 0
  011000100     13 0
* 010010100     23 0

Observe que as barras 0da primeira seção correspondem às 10outras três seções. Se girarmos as barras a serem ordenadas 40123, o padrão que vemos é

    40123
04  xx...
14  x.x..
01  .xx..
24  x..x.
02  .x.x.
12  ..xx.
34  x...x
03  .x..x
13  ..x.x
23  ...xx

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-B0da esquerda para a direita em sua representação e representar cada código como SBBíndices, a sequência 12..90AB..YZ-. *se tornará 010 020 021 030 031 032 040 041 042 043 110 120 ... 342 343.

Peter Taylor
fonte