Knowledge Base Article
Understanding barcodes, how they are formed, the different types of barcodes
Everyone has seen barcodes on items in grocery store. They are a series of vertical lines and spaces that represent information which can be interpreted by optical scanning and decoding devices. By using barcodes and a good, clean barcode reader (or scanner) the time it takes to read data is significantly reduced and simplified.
To complicate things, there are many different types of barcodes. The barcodes supported by i2 include:
- Code 39
- UPC-A
- EAN-13
- Code 28
- UPC-E
- ISBN Addon 2
- Code 93
- Codabar
- ISBN Addon 5
- Interleaved 2/5
- EAN-8
- Airline 2 of 5
- BCD Matrix
- Matrix 2 of 5
- Code 32
- Invert 2 of 5
- Datalogic 2 of 5
- PDF 417
Each of these barcodes has their place and unique use
however some are more popular than others. For the purposes of simplicity, well
look at 128 (Code 28) which is among the most popular and widely used barcodes.

One of the reasons for the popularity of Code 128 is that it
allows the full ASCII 128 character set to be encoded. By using 4 different bar
and space widths it achieves a more compact symbol than would be possible using
the older binary (Two bar/space widths) barcodes.
Code 128 may be scanned bidirectionally and there is no
restriction on the number of characters allowed in each symbol. There is of
course a practical limit determined by the physical size of the resulting
barcode and the scanning equipment.
So, let's look at how the barcode actually works and how it
is made to represent alpha-numeric characters.
Code 128 has three different character sets. (See the table
below - Code Set A, Code Set B and Code Set C). Each code set has one or more
characters reserved for special functions. The barcode symbol structure
consists of...
- A white space to the left of the bars
- Start character
- A variable number of data characters
- Check digit
- Stop character
- A white space to the right of the bars
Code 128 barcode structure
| Value |
Code Set |
Code Set |
Code Set |
Bar/Space |
| |
A | B | C | B S B S B S |
| 0 |
SP |
SP |
00 |
2 1 2 2 2 2 |
| 1 |
! |
! |
01 |
2 2 2 1 2 2 |
| 2 |
" |
" |
02 |
2 2 2 2 2 1 |
| 3 |
# |
# |
03 |
1 2 1 2 2 3 |
| 4 |
$ |
$ |
04 |
1 2 1 3 2 2 |
| 5 |
% |
% |
05 |
1 3 1 2 2 2 |
| 6 |
& |
& |
06 |
1 2 2 2 1 3 |
| 7 |
' |
' |
07 |
1 2 2 3 1 2 |
| 8 |
( |
( |
08 |
1 3 2 2 1 2 |
| 9 |
) |
) |
09 |
2 2 1 2 1 3 |
| 10 |
* |
* |
10 |
2 2 1 3 1 2 |
| 11 |
+ |
+ |
11 |
2 3 1 2 1 2 |
| 12 |
, |
, |
12 |
1 1 2 2 3 2 |
| 13 |
- |
- |
13 |
1 2 2 1 3 2 |
| 14 |
. |
. |
14 |
1 2 2 2 3 1 |
| 15 |
/ |
/ |
15 |
1 1 3 2 2 2 |
| 16 |
0 |
0 |
16 |
1 2 3 1 2 2 |
| 17 |
1 |
1 |
17 |
1 2 3 2 2 1 |
| 18 |
2 |
2 |
18 |
2 2 3 2 1 1 |
| 19 |
3 |
3 |
19 |
2 2 1 1 3 2 |
| 20 |
4 |
4 |
20 |
2 2 1 2 3 1 |
| 21 |
5 |
5 |
21 |
2 1 3 2 1 2 |
| 22 |
6 |
6 |
22 |
2 2 3 1 1 2 |
| 23 |
7 |
7 |
23 |
3 1 2 1 3 1 |
| 24 |
8 |
8 |
24 |
3 1 1 2 2 2 |
| 25 |
9 |
9 |
25 |
3 2 1 1 2 2 |
| 26 |
: |
: |
26 |
3 2 1 2 2 1 |
| 27 |
; |
; |
27 |
3 1 2 2 1 2 |
| 28 |
< |
< |
28 |
3 2 2 1 1 2 |
| 29 |
= |
= |
29 |
3 2 2 2 1 1 |
| 30 |
> |
> |
30 |
2 1 2 1 2 3 |
| 31 |
? |
? |
31 |
2 1 2 3 2 1 |
| 32 |
@ |
@ |
32 |
2 3 2 1 2 1 |
| 33 |
A |
A |
33 |
1 1 1 3 2 3 |
| 34 |
B |
B |
34 |
1 3 1 1 2 3 |
| 35 |
C |
C |
35 |
1 3 1 3 2 1 |
| 36 |
D |
D |
36 |
1 1 2 3 1 3 |
| 37 |
E |
E |
37 |
1 3 2 1 1 3 |
| 38 |
F |
F |
38 |
1 3 2 3 1 1 |
| 39 |
G |
G |
39 |
2 1 1 3 1 3 |
| 40 |
H |
H |
40 |
2 3 1 1 1 3 |
| 41 |
I |
I |
41 |
2 3 1 3 1 1 |
| 42 |
J |
J |
42 |
1 1 2 1 3 3 |
| 43 |
K |
K |
43 |
1 1 2 3 3 1 |
| 44 |
L |
L |
44 |
1 3 2 1 3 1 |
| 45 |
M |
M |
45 |
1 1 3 1 2 3 |
| 46 |
N |
N |
46 |
1 1 3 3 2 1 |
| 47 |
O |
O |
47 |
1 3 3 1 2 1 |
| 48 |
P |
P |
48 |
3 1 3 1 2 1 |
| 49 |
Q |
Q |
49 |
2 1 1 3 3 1 |
| 50 |
R |
R |
50 |
2 3 1 1 3 1 |
| 51 |
S |
S |
51 |
2 1 3 1 1 3 |
| 52 |
T |
T |
52 |
2 1 3 3 1 1 |
| 53 |
U |
U |
53 |
2 1 3 1 3 1 |
| 54 |
V |
V |
54 |
3 1 1 1 2 3 |
| 55 |
W |
W |
55 |
3 1 1 3 2 1 |
| 56 |
X |
X |
56 |
3 3 1 1 2 1 |
| 57 |
Y |
Y |
57 |
3 1 2 1 1 3 |
| 58 |
Z |
Z |
58 |
3 1 2 3 1 1 |
| 59 |
[ |
[ |
59 |
3 3 2 1 1 1 |
| 60 |
\ |
\ |
60 |
3 1 4 1 1 1 |
| 61 |
] |
] |
61 |
2 2 1 4 1 1 |
| 62 |
^ |
^ |
62 |
4 3 1 1 1 1 |
| 63 |
_ |
_ |
63 |
1 1 1 2 2 4 |
| 64 |
NUL |
` |
64 |
1 1 1 4 2 2 |
| 65 |
SOH |
a |
65 |
1 2 1 1 2 4 |
| 66 |
STX |
b |
66 |
1 2 1 4 2 1 |
| 67 |
ETX |
c |
67 |
1 4 1 1 2 2 |
| 68 |
EOT |
d |
68 |
1 4 1 2 2 1 |
| 69 |
ENQ |
e |
69 |
1 1 2 2 1 4 |
| 70 |
ACK |
f |
70 |
1 1 2 4 1 2 |
| 71 |
BEL |
g |
71 |
1 2 2 1 1 4 |
| 72 |
BS |
h |
72 |
1 2 2 4 1 1 |
| 73 |
HT |
i |
73 |
1 4 2 1 1 2 |
| 74 |
LF |
j |
74 |
1 4 2 2 1 1 |
| 75 |
VT |
k |
75 |
2 4 1 2 1 1 |
| 76 |
FF |
I |
76 |
2 2 1 1 1 4 |
| 77 |
CR |
m |
77 |
4 1 3 1 1 1 |
| 78 |
SO |
n |
78 |
2 4 1 1 1 2 |
| 79 |
SI |
o |
79 |
1 3 4 1 1 1 |
| 80 |
DLE |
p |
80 |
1 1 1 2 4 2 |
| 81 |
DC1 |
q |
81 |
1 2 1 1 4 2 |
| 82 |
DC2 |
r |
82 |
1 2 1 2 4 1 |
| 83 |
DC3 |
s |
83 |
1 1 4 2 1 2 |
| 84 |
DC4 |
t |
84 |
1 2 4 1 1 2 |
| 85 |
NAK |
u |
85 |
1 2 4 2 1 1 |
| 86 |
SYN |
v |
86 |
4 1 1 2 1 2 |
| 87 |
ETB |
w |
87 |
4 2 1 1 1 2 |
| 88 |
CAN |
x |
88 |
4 2 1 2 1 1 |
| 89 |
EM |
y |
89 |
2 1 2 1 4 1 |
| 90 |
SUB |
z |
90 |
2 1 4 1 2 1 |
| 91 |
ESC |
{ |
91 |
4 1 2 1 2 1 |
| 92 |
FS |
| |
92 |
1 1 1 1 4 3 |
| 93 |
GS |
} |
93 |
1 1 1 3 4 1 |
| 94 |
RS |
~ |
94 |
1 3 1 1 4 1 |
| 95 |
US |
DEL |
95 |
1 1 4 1 1 3 |
| 96 |
FNC 3 |
FNC 3 |
96 |
1 1 4 3 1 1 |
| 97 |
FNC 2 |
FNC 2 | 97 |
4 1 1 1 1 3 |
| 98 |
SHIFT |
SHIFT | 98 |
4 1 1 3 1 1 |
| 99 |
CODE C |
CODE C |
99 |
1 1 3 1 4 1 |
| 100 |
CODE B |
FNC 4 |
CODE B |
1 1 4 1 3 1 |
| 101 |
FNC 4 |
CODE A |
CODE A |
3 1 1 1 4 1 |
| 102 |
FNC 1 |
FNC 1 |
FNC 1 |
4 1 1 1 3 1 |
| 103 |
Start A |
Start A |
Start A |
2 1 1 4 1 2 |
| 104 |
Start B |
Start B |
Start B |
2 1 1 2 1 4 |
| 105 |
Start C |
Start C |
Start C |
2 1 1 2 3 2 |
| 106 |
Stop |
Stop |
Stop |
2 3 3 1 1 1 2 |
What's a Check Digit?
The check digit is a Modulus 103 checksum. It is calculated by summing the start code 'value' to the products of each character's 'value' multiplied by its position in the barcode string. The left most character is position 1. The sum of the start code value and the products is divided by 103. The remainder is the check digits 'value'.
By calculating this check digit we can make certain whether a good read has been achieved for our barcode and ensure the integrity of the read.
For example, to represent "Code 128" our barcode would look like this...
| Value | Total | |||
| Start Code | B | 104 | 104 | |
| Position 1 | C | 35 | 1 x 35 = | 35 |
| Position 2 | o | 79 | 2 x 79 = | 158 |
| Position 3 | d | 68 | 3 x 68 = | 204 |
| Position 4 | e | 69 | 4 x 69 = | 276 |
| Position 5 | 0 | 5 x 0 = | 0 | |
| Position 6 | 1 | 17 | 6 x 17 = | 102 |
| Position 7 | 2 | 18 | 7 x 18 = | 126 |
| Position 8 | 8 | 24 | 8 x 24 = | 192 |
| 1197 |
1197/103 = 11 remainder 64
The check digit is the character from the table with value 64
When it comes to reading barcodes within documents, it makes you glad that i2 does all this calculating for you! As you can see, barcodes are an accurate and fast way of saving and retrieving data with extremely low failure rates. The trick is to make sure you do a good scan and ensure you read your barcodes with an accurate processing application