Code 39

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacji, wyszukiwania
Przykład zapisu znaków alfanumerycznych w kodzie "Code39". Znaki "*" są oznaczeniami Start/Stop, natomiast "$" jest znakiem kontrolnym wyliczonym na podstawie modulo43

Code 39 (znany też jako "USS Code 39", "Code 3/9", "Kod 3 z 9", "USD-3", "Alpha39") – alfanumeryczny kod kreskowy o stałej szerokości pojedynczego znaku. Kod ten powstał w 1974 roku, a rozpowszechnił się po zastosowaniu go przez Departament Obrony USA do oznaczania przesyłek od dostawców. Obecnie jest wykorzystywany w branży motoryzacyjnej do oznaczania części. Największą wadą kodu jest stosunkowo mała gęstość zapisu danych. Z tego względu kod ten nie nadaje się do umieszczania na małych przedmiotach. Zaletą kodu jest fakt, iż może on zostać odczytany przez prawie każdy czytnik kodów kreskowych.

Budowa kodu[edytuj | edytuj kod]

Wykorzystując podstawową wersję kodu można zakodować 43 znaki alfanumeryczne (duże litery od A do Z, cyfry, znaki specjalne: -, ., spacja, $, /, +, %) oraz symbol *, który służy do oznaczenia początku i końca kodu. Każdy znak składa się z dziewięciu pasków (występuje na przemian 5 pasków czarnych i 4 paski białe), przy czym 3 spośród nich mają większą szerokość (stąd nazwa kod 3 z 9). Stosunek szerokości pasków grubych do cienkich musi mieścić się w przedziale od 2:1 do 3:1.

W podstawowej wersji kod nie zawiera sumy kontrolnej. Jednakże jest on tak skonstruowany, iż pojedynczy błędnie odczytany pasek nie spowoduje rozpoznania znaku jako innego.

Tablica znaków[edytuj | edytuj kod]

Znak * jest wykorzystywany jedynie do oznaczenia początku i końca kodu. Ze względu na jego asymetryczną postać czytnik kodów kreskowych jest w stanie określić kierunek odczytu kodu.

Poniższa tabela prezentuje sposób zapisu wszystkich 44 znaków kodowanych w Kodzie 3 z 9:

Legenda
Format1 Format2 Pasek
W B szeroki - czarny
N b wąski - czarny
w W szeroki - biały
n w wąski - biały
Tablica znaków
Wart. Znak Format1 Format2
0 0 NnNwWnWnN bwbWBwBwb
1 1 WnNwNnNnW BwbWbwbwB
2 2 NnWwNnNnW bwBWbwbwB
3 3 WnWwNnNnN BwBWbwbwb
4 4 NnNwWnNnW bwbWBwbwB
5 5 WnNwWnNnN BwbWBwbwb
6 6 NnWwWnNnN bwBWBwbwb
7 7 NnNwNnWnW bwbWbwBwB
8 8 WnNwNnWnN BwbWbwBwb
9 9 NnWwNnWnN bwBWbwBwb
10 A WnNnNwNnW BwbwbWbwB
11 B NnWnNwNnW bwBwbWbwB
12 C WnWnNwNnN BwBwbWbwb
13 D NnNnWwNnW bwbwBWbwB
14 E WnNnWwNnN BwbwBWbwb
15 F NnWnWwNnN bwBwBWbwb
16 G NnNnNwWnW bwbwbWBwB
17 H WnNnNwWnN BwbwbWBwb
18 I NnWnNwWnN bwBwbWBwb
19 J NnNnWwWnN bwbwBWBwb
20 K WnNnNnNwW BwbwbwbWB
21 L NnWnNnNwW bwBwbwbWB
22 M WnWnNnNwN BwBwbwbWb
23 N NnNnWnNwW bwbwBwbWB
24 O WnNnWnNwN BwbwBwbWb
25 P NnWnWnNwN bwBwBwbWb
26 Q NnNnNnWwW bwbwbwBWB
27 R WnNnNnWwN BwbwbwBWb
28 S NnWnNnWwN bwBwbwBWb
29 T NnNnWnWwN bwbwBwBWb
30 U WwNnNnNnW BWbwbwbwB
31 V NwWnNnNnW bWBwbwbwB
32 W WwWnNnNnN BWBwbwbwb
33 X NwNnWnNnW bWbwBwbwB
34 Y WwNnWnNnN BWbwBwbwb
35 Z NwWnWnNnN bWBwBwbwb
36 - NwNnNnWnW bWbwbwBwB
37 . WwNnNnWnN BWbwbwBwb
38 (spacja) NwWnNnWnN bWBwbwBwb
39 $ NwNwNwNnN bWbWbWbwb
40 / NwNwNnNwN bWbWbwbWb
41 + NwNnNwNwN bWbwbWbWb
42  % NnNwNwNwN bwbWbWbWb
-- * NwNnWnWnN bWbwBwBwb

Pomiędzy znakmi wstawiany jest dodatkowy wąski biały pasek. Nie zostało to co prawda określone w standardzie, jednakże czytniki mogą nie odczytać kodu, który nie zawiera takich przerw. Dla przykładu kod składający się z litery "A" będzie wyglądał następująco:
[bWbwBwBwb]w[BwbwbWbwB]w[bWbwBwBwb] i zostanie odczytany jako "*A*".

Suma kontrolna (Code 39 mod 43)[edytuj | edytuj kod]

Czasem do kodu 3 z 9 dodawana jest dodatkowa suma kontrolna (odmiana kodu: Code 39 mod 43). Oblicza się ją następująco:

  • Sumuje się wartości (od 0 do 42) wszystkich znaków występujących w kodzie (z wyjątkiem znaków start/stop)
  • Od wyniku oblicza się wartość modulo 43
  • Otrzymany wynik jest wartością znaku sumy kontrolnej

Znak sumy kontrolnej dopisuje się do kodu przed znakiem stopu.

W Visual Basicu można przedstawić to w następujący sposób:

Const charSet As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%"
Function Mod43(C39 As String) As String
  For i = 1 To Len(C39)
    total = InStr(charSet, Mid(C39, i, 1)) - 1 + total
  Next i
  Mod43 = C39 & Mid$(charSet, (total Mod 43 + 1), 1)
End Function

Zapis całej tablicy znaków ASCII w Code 39[edytuj | edytuj kod]

Istnieje rozwinięcie kodu 3 z 9 (Code 39 plus) pozwalające zakodować przy jego pomocy wszystkie 128 znaków kodu ASCII. 44 standardowe znaki kodowane są identycznie, jak w odmianie podstawowej. Natomiast pozostałe symbole reprezentowane są przez sekwencje dwóch znaków podstawowych.

Tablica
Nr Znak Kodowanie     Nr Znak Kodowanie     Nr Znak Kodowanie     Nr Znak Kodowanie
0 NUL  %U 32 [spacja] [spacja] 64 @  %V 96 `  %W
1 SOH $A 33  ! /A 65 A A 97 a +A
2 STX $B 34 " /B 66 B B 98 b +B
3 ETX $C 35 # /C 67 C C 99 c +C
4 EOT $D 36 $ /D 68 D D 100 d +D
5 ENQ $E 37  % /E 69 E E 101 e +E
6 ACK $F 38 & /F 70 F F 102 f +F
7 BEL $G 39 ' /G 71 G G 103 g +G
8 BS $H 40 ( /H 72 H H 104 h +H
9 HT $I 41 ) /I 73 I I 105 i +I
10 LF $J 42 * /J 74 J J 106 j +J
11 VT $K 43 + /K 75 K K 107 k +K
12 FF $L 44 , /L 76 L L 108 l +L
13 CR $M 45 - - 77 M M 109 m +M
14 SO $N 46 . . 78 N N 110 n +N
15 SI $O 47 / /O 79 O O 111 o +O
16 DLE $P 48 0 0 80 P P 112 p +P
17 DC1 $Q 49 1 1 81 Q Q 113 q +Q
18 DC2 $R 50 2 2 82 R R 114 r +R
19 DC3 $S 51 3 3 83 S S 115 s +S
20 DC4 $T 52 4 4 84 T T 116 t +T
21 NAK $U 53 5 5 85 U U 117 u +U
22 SYN $V 54 6 6 86 V V 118 v +V
23 ETB $W 55 7 7 87 W W 119 w +W
24 CAN $X 56 8 8 88 X X 120 x +X
25 EM $Y 57 9 9 89 Y Y 121 y +Y
26 SUB $Z 58  : /Z 90 Z Z 122 z +Z
27 ESQ  %A 59  ;  %F 91 [  %K 123 {  %P
28 FS  %B 60 <  %G 92 \  %L 124  %Q
29 GS  %C 61 =  %H 93 ]  %M 125 }  %R
30 RS  %D 62 >  %I 94 ^  %N 126 ~  %S
31 US  %E 63  ?  %J 95 _  %O 127 DEL  %T

Linki zewnętrzne[edytuj | edytuj kod]