Code 128
Code 128 är den idag vanligaste förekommande symbolkodningen av streckkod och används bland annat för märkning av artiklar, försändelser m.m. enligt GS1-128 systemet. Code 128 kan koda de 128 första tecknen i ASCII-kodningen men ger även en kompakt kodning av numreriska värden. I koden ingår även en kontrollkod för att säkra mot läsfel.
Koduppbyggnad
[redigera | redigera wikitext]En Code 128 symbol består av följande delar:
- Startkod
- Data
- Kontrollsiffra
- Slutkod
Start och slutkod är en särskild teckenkombination som används av läsare för att avgöra vilken symbolkodning som används. För Code 128 anger även startkoden vilken teckengrupp som koden börjar med. Före en Startkod resp. efter en Slutkod måste det alltid finnas ett tomt område på minst 10 st ljusa enheter en sk. tyst zon.
Varje tecken i Code 128 består av totalt 11 st lika långa ljusa eller mörka element vilka i sin tur är uppdelade i 6 grupper (tre mörka och tre ljusa) varav den första alltid är en grupp av mörka. Ett undantag är Stopptecknet som har en sjunde extra mörk grupp på slutet. Varje grupp av element består av 1-4 element. Vanligtvis kallas mörka grupper för svarta och ljusa för vita men färgerna kan vara andra kombinationer av färger som till exempel blått och gult.
Omedelbart efter sista tecknet i datan och före Stopptecknet finns en kontrollsumma som beräknas på Starttecknet och Datan.
Kodning av tecken
[redigera | redigera wikitext]Vilken kombination av mörka eller ljusa delar som ska användas för att koda ett visst ASCII-tecken går inte att beräkna från till exempel ASCII-värdet utan tas ur en tabell bestående av tre grupper (kolumner).
För att både klara att koda 128 ASCII tecken och på ett kompakt sätt visa det vanligaste förekommande, endast numreriska koder, används tre olika teckengrupper kallade 128A, 128B, 128C, vilka skiftas mellan med olika start eller skifttecken.
- Teckengrupp 128A - De 95 första ASCII tecknen. Kontrolltecken 0-31, grundläggande symboler, siffror 0-9, versaler A-Z m.m.
- Teckengrupp 128B - ASCII tecken 32-127. Grundläggande symboler, siffror 0-9, versaler A-Z, gemena a-z.
- Teckengrupp 128C - Dubbelkodade siffror. Här kodas siffror 0-9 som par vilket till exempel gör att koden för 123456 bara blir tre tecken långt tecknen (12),(34),(56).
Sammansättningen av en Code 128 streckkod
[redigera | redigera wikitext]För att skapa en kodsymbol behövs en viss logik.
Beroende på datan man vill koda så måste man välja vilken Teckengrupp man skall starta med och för att veta det måste man på något sätt analysera den kommande datan. Om man vet att de första två tecknen i datan är siffror ska man börja med en startkod-grupp C för att nyttja den kompakta kodningen av siffror. Det är dock inget formellt fel att koda en Startkod-grupp B men man måste då koda varje siffra med en 11 element lång kod. För varje gång man byter kodgrupp får man en viss overhead så den slutliga längden på symbolen är beroende av datans innehåll. Kompaktast i förhållande till antal kodade tecken är en kod med datainnehåll av ett jämnt antal siffror.
Beroende av om det tecken man vill koda finns med i den teckengrupp som senast valdes med en startkod eller gruppskiftkod väljer man om en ny gruppskiftkod måste läggas in eller om tecknet kod kan läggas ut direkt.
Kontrolltecknet beräknas på starttecknet och efterföljande data. Metoden som används heter Modulus 103 och går till så att startkoden adderas till efterföljande datateckens nummer (enligt tabell) multiplicerade med sin position. Första tecknet efter startkoden är position 1. När summan är klar delas den med 103 varefter resten i divisionen blir kontrolltecknet.
Exempel
[redigera | redigera wikitext]Vi vill skapa en Code-128 streckod innehållande texten "Wiki1234"
Först väljs startkoden START_B för att kunna koda både versaler och gemena tecken. START_B är i tabellen kod nummer 104=11010010000 (OBS! en etta eller nolla här är här en längdenhet lång). Kontrollsumman är nu=104
W är ur tabellen kolumn B nummer 55=11101000110. Då detta är position ett blir bidraget för detta till kontrollsumman 1 * 55. Kontrollsumman är alltså nu 104+55=159
i är ur tabellen kolumn B nummer 73=10000110100. Detta är position 2 och bidraget för detta till kontrollsumman är 2 * 73=146. Kontrollsumman är alltså nu 104+55+146=305
k är ur tabellen kolumn B nummer 75=11000010010. Detta är position 3 och bidraget för detta till kontrollsumman är 3 * 75=225. Kontrollsumman är alltså nu 104+55+146+225=530
i är ur tabellen kolumn B nummer 73=10000110100. Detta är position 4 och bidraget för detta till kontrollsumman är 4 * 73=292. Kontrollsumman är alltså nu 530+292=822
För att få en kompaktare kod vid kodningen av siffrorna 12 byter vi nu till kodgrupp C varför tecknet Code_C (ur kolumn B) först ska läggas till. Code_C ur tabellen kolumn B nummer 99=10111011110. Detta är position 5 och bidraget för detta till kontrollsumman är 5 * 99=495. Kontrollsumman är alltså nu 822+495=1317
12 är ur tabellen kolumn C nummer 12=10110011100. Detta är position 6 och bidraget för detta till kontrollsumman är 6 * 12=72. Kontrollsumman är alltså nu 1317+72=1389
34 är ur tabellen kolumn C nummer 34=10001011000. Detta är position 7 och bidraget för detta till kontrollsumman är 7 * 34=238. Kontrollsumman är alltså nu 1389+238=1627
För att beräkna checksumman delas summan ovan 1627 med 103 och resten (Modulus) blir 82. Ur tabellen är nummer 82=10010011110
Sluttecknet är längre än övriga tecken och är 106=1100011101011
Den sammanlagda koden blir till slut :
START_B | 11010010000 |
W | 11101000110 |
i | 10000110100 |
k | 11000010010 |
i | 10000110100 |
Code_C | 10111011110 |
12 | 10110011100 |
34 | 10001011000 |
Kontrollsiffra =82 | 10010011110 |
Sluttecken | 1100011101011 |
Code 128 tabellen
[redigera | redigera wikitext]En etta (1) i tabellens kodkolumn motsvarar ett Mörkt element.
Nummer | Grupp A | Grupp B | Grupp C | Kod |
---|---|---|---|---|
00 | 00 | 11011001100 | ||
01 | ! | ! | 01 | 11001101100 |
02 | " | " | 02 | 11001100110 |
03 | # | # | 03 | 10010011000 |
04 | $ | $ | 04 | 10010001100 |
05 | % | % | 05 | 10001001100 |
06 | & | & | 06 | 10011001000 |
07 | ' | ' | 07 | 10011000100 |
08 | ( | ( | 08 | 10001100100 |
09 | ) | ) | 09 | 11001001000 |
10 | * | * | 10 | 11001000100 |
11 | + | + | 11 | 11000100100 |
12 | , | , | 12 | 10110011100 |
13 | - | - | 13 | 10011011100 |
14 | . | . | 14 | 10011001110 |
15 | / | / | 15 | 10111001100 |
16 | 0 | 0 | 16 | 10011101100 |
17 | 1 | 1 | 17 | 10011100110 |
18 | 2 | 2 | 18 | 11001110010 |
19 | 3 | 3 | 19 | 11001011100 |
20 | 4 | 4 | 20 | 11001001110 |
21 | 5 | 5 | 21 | 11011100100 |
22 | 6 | 6 | 22 | 11001110100 |
23 | 7 | 7 | 23 | 11101101110 |
24 | 8 | 8 | 24 | 11101001100 |
25 | 9 | 9 | 25 | 11100101100 |
26 | : | : | 26 | 11100100110 |
27 | ; | ; | 27 | 11101100100 |
28 | < | < | 28 | 11100110100 |
29 | = | = | 29 | 11100110010 |
30 | > | > | 30 | 11011011000 |
31 | ? | ? | 31 | 11011000110 |
32 | @ | @ | 32 | 11000110110 |
33 | A | A | 33 | 10100011000 |
34 | B | B | 34 | 10001011000 |
35 | C | C | 35 | 10001000110 |
36 | D | D | 36 | 10110001000 |
37 | E | E | 37 | 10001101000 |
38 | F | F | 38 | 10001100010 |
39 | G | G | 39 | 11010001000 |
40 | H | H | 40 | 11000101000 |
41 | I | I | 41 | 11000100010 |
42 | J | J | 42 | 10110111000 |
43 | K | K | 43 | 10110001110 |
44 | L | L | 44 | 10001101110 |
45 | M | M | 45 | 10111011000 |
46 | N | N | 46 | 10111000110 |
47 | O | O | 47 | 10001110110 |
48 | P | P | 48 | 11101110110 |
49 | Q | Q | 49 | 11010001110 |
50 | R | R | 50 | 11000101110 |
51 | S | S | 51 | 11011101000 |
52 | T | T | 52 | 11011100010 |
53 | U | U | 53 | 11011101110 |
54 | V | V | 54 | 11101011000 |
55 | W | W | 55 | 11101000110 |
56 | X | X | 56 | 11100010110 |
57 | Y | Y | 57 | 11101101000 |
58 | Z | Z | 58 | 11101100010 |
59 | [ | [ | 59 | 11100011010 |
60 | \ | \ | 60 | 11101111010 |
61 | ] | ] | 61 | 11001000010 |
62 | ^ | ^ | 62 | 11110001010 |
63 | _ | _ | 63 | 10100110000 |
64 | NUL | ` | 64 | 10100001100 |
65 | SOH | a | 65 | 10010110000 |
66 | STX | b | 66 | 10010000110 |
67 | ETX | c | 67 | 10000101100 |
68 | EOT | d | 68 | 10000100110 |
69 | ENQ | e | 69 | 10110010000 |
70 | ACK | f | 70 | 10110000100 |
71 | BEL | g | 71 | 10011010000 |
72 | BS | h | 72 | 10011000010 |
73 | HT | i | 73 | 10000110100 |
74 | LF | j | 74 | 10000110010 |
75 | VT | k | 75 | 11000010010 |
76 | FF | l | 76 | 11001010000 |
77 | CR | m | 77 | 11110111010 |
78 | SO | n | 78 | 11000010100 |
79 | SI | o | 79 | 10001111010 |
80 | DLE | p | 80 | 10100111100 |
81 | DC1 | q | 81 | 10010111100 |
82 | DC2 | r | 82 | 10010011110 |
83 | DC3 | s | 83 | 10111100100 |
84 | DC4 | t | 84 | 10011110100 |
85 | NAK | u | 85 | 10011110010 |
86 | SYN | v | 86 | 11110100100 |
87 | ETB | w | 87 | 11110010100 |
88 | CAN | x | 88 | 11110010010 |
89 | EM | y | 89 | 11011011110 |
90 | SUB | z | 90 | 11011110110 |
91 | ESC | { | 91 | 11110110110 |
92 | FS | 92 | 10101111000 | |
93 | GS | } | 93 | 10100011110 |
94 | RS | ~ | 94 | 10001011110 |
95 | US | DEL | 95 | 10111101000 |
96 | FNC3 | FNC3 | 96 | 10111100010 |
97 | FNC2 | FNC2 | 97 | 11110101000 |
98 | SHIFT | SHIFT | 98 | 11110100010 |
99 | Code_C | Code_C | 99 | 10111011110 |
100 | Code_B | FNC4 | Code_B | 10111101110 |
101 | FNC4 | Code_A | Code_A | 11101011110 |
102 | FNC1 | FNC1 | FNC1 | 11110101110 |
103 | START_A | START_A | START_A | 11010000100 |
104 | START_B | START_B | START_B | 11010010000 |
105 | START_C | START_C | START_C | 11010011100 |
106 | STOP | STOP | STOP | 1100011101011 |