¿Cuál es la fórmula para el alfabeto de código de barras 3 de 9?

8

Fondo: 3 de 9 Alfabeto de código de barras

Una sintaxis simple para 3 de 9 códigos de barras

¿Cuál es la fórmula detrás del alfabeto y los dígitos en un código de barras 3 de 9?

Por ejemplo, ASCII tiene una disposición relativamente clara. Los números comienzan en 33, las mayúsculas en 65, las minúsculas en 97. Desde estos puntos de partida puede inferir el código ASCII para cualquier número o letra. El punto de inicio para cada rango también es un múltiplo de 32 + 1.

Los códigos de barras parecen aleatorios y carecen de secuencia. Si usamos la sintaxis del segundo enlace, estos son los primeros seis caracteres en 3 de 9:

A 100-01
B 010-01
C 110-00
D 001-01
E 101-00
F 011-00

No veo ningún patrón aquí; ¿Qué es? Estoy tan interesado en el patrón previsto del diseñador detrás de estos como estoy en alguien que diseñe un algoritmo propio que pueda darle el código anterior para un personaje determinado en función de su secuencia.

Luché con dónde poner esta pregunta; ¿Es historia, informática, ciencia de la información? Elegí Programadores porque una búsqueda de StackExchange tuvo la mayor cantidad de aciertos de código de barras aquí, y porque quería relacionarlo específicamente con ASCII para explicar qué tipo de fórmula / explicación estoy buscando.


Actualizar

Para los curiosos, aquí está la lista completa de todos los caracteres básicos en el Código 39: http://jsfiddle.net/b9chris/LnX2e/2/

(las líneas de origen se toman de mi código de barras C # lib )

Notará que la sintaxis simplificada propuesta puede confundir un poco el problema, ya que puede implicar que cada carácter es un número de 5 bits con una posición de guión. Los 4 personajes finales tienen numerosos guiones (espacios amplios). Realmente, estos códigos se consideran mejor como números de 9 bits que tienen la mayoría de los bits impares establecidos en 0 para la mayoría de los símbolos. Aquí están como números de 9 bits: http://jsfiddle.net/b9chris/LnX2e/1/

Chris Moschini
fuente
No leí el wiki, pero después de ver tu ejemplo, diría que el siguiente sería G 111-01
Pieter B
Lamentablemente es G 000-11.
Chris Moschini

Respuestas:

8

No sé si esta es la explicación correcta, pero según lo que publicaste: los primeros 3 bits son 1 a 6 en binario inverso. El último dígito es 1 cuando hay un número impar de 1s en los primeros 3 (4?) Bits, por lo que probablemente sea un bit de paridad.

Foole
fuente
9

El patrón correcto para pensar cómo funciona esta codificación es que 1) encuentre un conjunto de "secuencias de bits seguras", luego 2) asigne sus caracteres a estas secuencias.

El resultado final se siente como un orden aleatorio, pero cada uno de estos pasos es bastante lógico per se.

Las secuencias de bits "seguras" son tales que si invierte un solo bit en cualquiera de ellas, el resultado estará "fuera" de su conjunto. Esta es una forma de verificación de errores, básicamente un importante "punto de venta" del Código 39.

  • Digamos, si quieres "codificar" de esa manera dos caracteres, necesitarás dos bits como mínimo. 00y 11haga un conjunto de dos secuencias de bits seguras: rompa (invierta) un bit en cualquiera de estas y obtendrá un código no válido. Tenga en cuenta que el conjunto de 01y también 10es seguro.
     
    Para codificar tres caracteres, uno necesita más de dos bits.
    Ejemplo de conjunto seguro para tres caracteres es 000, 110 y 011.

Ahora, necesita codificar 39 caracteres.

Primero, encuentre cuántos bits necesita para eso, luego encuentre un conjunto de "secuencias de bits seguras".

Y solo después de eso, mapea tus personajes, como first char -> first safe bit sequence, second char -> second sequenceetc.

Verá, es más fácil pensar en términos de "pasos" aquí, no en términos de "fórmula".


Algoritmo para encontrar secuencias de bits seguras para un número dado de bits Npodría ser de la siguiente manera,

  1. asignar matriz booleana de longitud 2 power N, inicializar sus elementos contrue
  2. comenzar con 0- su representación booleana es Nbits, cada cero
  3. do Nveces: invierta uno de los bits en 0, que será "secuencia de bits insegura",
    marque el elemento de matriz en la matriz de índice resultante false
    [1000], matriz [0100], matriz [0010], etc.
  4. encuentre el siguiente después del 0índice en la matriz donde está el elemento true,
    para la representación de bits de ese índice, repita el mismo bucle que el anterior:
    invierta uno de los bits y marque el elemento respectivo ("inseguro") de la matrizfalse
  5. encuentre el siguiente trueíndice y así sucesivamente hasta que finalice la matriz

Al final, los elementos de la matriz marcados truerepresentarán "secuencias de bits seguras".

Para transformar estas secuencias en código de barras, uno simplemente mapearía pares de bits apropiadamente, como 00 - negro estrecho, 01 - blanco estrecho, 10 - ancho negro, 11 - ancho blanco .

mosquito
fuente
3

La página de Wikipedia a la que enlaza menciona que

Su diseño original incluía dos barras anchas y un amplio espacio en cada personaje, lo que resulta en 40 personajes posibles.

Como referencia cita las memorias de David Allais:

Procedí a ilustrar un personaje de símbolo usando el lado de la tiza para dibujar las barras anchas. La estructura de cinco barras y cuatro espacios, incluidas dos barras anchas y un espacio ancho, me llegó en un instante. Las dos de cinco codificaciones en las barras permitieron diez combinaciones y el amplio espacio provisto para cuatro grupos separados.

Con eso en mente, podemos identificar las barras y espacios marcados y surge un patrón:

  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

Tenga en cuenta que las barras para 0en la primera sección corresponden en cambio a 10las otras tres secciones. Si giramos las barras a ordenar, 40123entonces el patrón que vemos es

    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 es una de las formas obvias de enumerar pares de 5 elementos.

De manera equivalente, si nombra los bits B1-S3-B2-S0-B3-S1-B4-S2-B0de izquierda a derecha en su representación y en su lugar representa cada código como SBBíndices, entonces la secuencia se 12..90AB..YZ-. *convierte 010 020 021 030 031 032 040 041 042 043 110 120 ... 342 343.

Peter Taylor
fuente