Qual è la formula per l'alfabeto con codice a barre 3 di 9?

8

Sfondo: Alfabeto 3 di 9 codici a barre

Una semplice sintassi per 3 di 9 codici a barre

Qual è la formula dietro l'alfabeto e le cifre in un codice a barre 3 di 9?

Ad esempio, ASCII ha una disposizione relativamente chiara. I numeri iniziano da 33, i maiuscoli a 65, i minuscoli a 97. Da questi punti di partenza puoi dedurre il codice ASCII per qualsiasi numero o lettera. Il punto di partenza per ogni intervallo è anche un multiplo di 32 + 1.

I codici a barre sembrano casuali e privi di sequenza. Se usiamo la sintassi dal secondo link, questi sono i primi sei caratteri in 3 di 9:

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

Non vedo pattern qui; che cos'è? Sono molto interessato allo schema previsto dal designer che sta dietro a questi, come lo sono in qualcuno che ha ideato un proprio algoritmo che può darti il codice sopra per un dato personaggio basato sulla sua sequenza.

Ho faticato con dove mettere questa domanda; è storia, informatica, scienza dell'informazione? Ho scelto i programmatori perché una ricerca di StackExchange ha avuto il maggior numero di hit di codici a barre qui, e perché volevo specificarlo in ASCII per spiegare che tipo di formula / spiegazione sto cercando.

Aggiornamento

Per i curiosi, ecco l'elenco completo di tutti i personaggi di base nel Codice 39: link

(le linee di origine sono prese dalla mia C # libcode bar )

Noterai che la sintassi semplificata proposta può confondere un po 'il problema, perché potrebbe implicare che ogni carattere è un numero a 5 bit con una posizione di trattino. Gli ultimi 4 personaggi hanno numerosi trattini (ampi spazi vuoti). In realtà, questi codici sono pensati come numeri a 9 bit che hanno la maggior parte dei bit dispari impostati su 0 per la maggior parte dei simboli. Eccoli come numeri a 9 bit: link

    
posta Chris Moschini 16.06.2012 - 00:49
fonte

3 risposte

8

Non so se questa è la spiegazione corretta, ma in base a ciò che hai postato: i primi 3 bit sono da 1 a 6 in binario al contrario. L'ultima cifra è 1 quando c'è un numero dispari di 1 nei primi 3 (4?) Bit, quindi questo è probabilmente un bit di parità.

    
risposta data 16.06.2012 - 05:52
fonte
9

Il modello giusto per pensare a come funziona questa codifica è che 1) trovi un insieme di "sequenze di bit sicure", quindi 2) mappa i tuoi personaggi in queste sequenze.

Il risultato finale sembra un ordine casuale, ma ognuno di questi passaggi è di per sé abbastanza logico.

Le sequenze di bit "sicure" sono tali che se inverti un singolo bit in una di esse, il risultato sarà "esterno" al tuo set. Questa è una forma di controllo degli errori - fondamentalmente un importante "punto di forza" del Codice 39.

  • Dì, se vuoi "codificare" in questo modo due caratteri, avrai almeno due bit. 00 e 11 creano un set di due sequenze di bit sicure - interrompono (invertite) un bit in ognuna di queste e otterrete codice non valido. Tieni presente che anche l'insieme di 01 e 10 è sicuro.

    Per codificare tre caratteri, uno ha bisogno di più di due bit.
    Esempio di set di sicurezza per tre caratteri: 000, 110 e 011.

Ora devi codificare 39 caratteri.

In primo luogo, trova la quantità di bit necessaria per questo, quindi trova un set di "sequenze di bit sicure".

E solo dopo, mappa i tuoi personaggi, come first char -> first safe bit sequence , second char -> second sequence ecc.

Vedi, è più facile pensare in termini di "passaggi" qui, non in termini di "formula".

L'algoritmo per trovare sequenze di bit sicure per un dato numero di bit N potrebbe essere come segue,

  1. alloca array booleano di lunghezza 2 power N , inizializza i suoi elementi con true
  2. inizia con 0 - la sua rappresentazione booleana è N bit, ogni zero
  3. fai N volte: inverti uno dei bit in 0 - che sarà "sequenza bit non sicura",
    contrassegna l'elemento dell'array nell'indice risultante false
    array [1000], array [0100], array [0010], ecc
  4. trova successivo dopo 0 indice nell'array dove l'elemento è true ,
    per la rappresentazione bit di tale indice, ripetere lo stesso ciclo come sopra:
    inverti uno dei bit e contrassegna il rispettivo elemento ("non sicuro") dell'array false
  5. trova il prossimo indice true e così via e così via fino alla fine dell'array

Alla fine, gli elementi dell'array contrassegnati true rappresenteranno "sequenze di bit sicure".

Per trasformare queste sequenze in codice a barre, si dovrebbero semplicemente mappare coppie di bit in modo appropriato, come 00 - nero stretto, 01 - bianco stretto, 10 nero largo, 11 - bianco largo .

    
risposta data 16.06.2012 - 10:10
fonte
3

La pagina di Wikipedia a cui fai riferimento menziona

Their original design included two wide bars and one wide space in each character, resulting in 40 possible characters.

Come riferimento cita le memorie di David Allais:

I proceeded to illustrate a symbol character using the side of the chalk to draw the wide bars. The structure of five bars and four spaces including two wide bars and one wide space came to me in flash. The two of five coding in the bars afforded ten combinations and the wide space provided for four separate groups.

Quindi con questo in mente possiamo identificare le barre e gli spazi marcati e un modello emerge:

  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

Nota che le barre per 0 nella prima sezione corrispondono invece a 10 nelle altre tre sezioni. Se ruotiamo le barre da ordinare 40123 , lo schema che vediamo è

    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

che è uno dei modi più ovvi per enumerare coppie di 5 elementi.

Equivalentemente, se nella tua rappresentazione nominali i bit B1-S3-B2-S0-B3-S1-B4-S2-B0 da sinistra a destra e invece rappresenti ciascun codice come indici SBB , la sequenza 12..90AB..YZ-. * diventa 010 020 021 030 031 032 040 041 042 043 110 120 ... 342 343 .

    
risposta data 18.07.2013 - 17:50
fonte

Leggi altre domande sui tag