Code 128 provides excellent density for all-numeric data and good density for alphanumeric data. It
is often selected over Code 39 in new applications because of its density and because it
offers a much larger selection of characters. The Code 128 standard is maintained by AIM
(Automatic Identification Manufacturers).
The Code 128 character set includes the digits 0-9, the letters A-Z (upper and lower case), and all
standard ASCII symbols and control codes. The codes are divided into three subsets A, B,
and C. There are three separate start codes to indicate which subset will be used; in
addition, each subset includes control characters to switch to another subset in the
middle of a barcode. Subset A includes the standard ASCII symbols, digits, upper case
letters, and control codes. Subset B includes standard ASCII symbols, digits, upper and
lower case letters. Subset C compresses two numeric digits into each character, providing
excellent density. Here is a sample of an all-numeric Subset C barcode that contains 12 digits;
compare its size to the
sample at the top of the page that contains 12 assorted characters:
Each character is 11 times the width of the narrowest bar; using a minimum bar width of
0.010" each character would be 0.11" wide. Using the 0.010" figure, 20 data
characters plus start code, check digit, and stop code would measure 2.55" wide (the
stop code is 13 times as wide as a narrow bar). Using Subset C with all-numeric data
provides 2:1 compression of the data for a total width of 1.45 inches.
Each character consists of 3 bars and 3 spaces, each of which may be 1, 2, or 3
elements wide (1 element = 1/11th of the character width). The bars always use an even
number of elements and the spaces use an odd number. This provides the basis for a
character-by-character consistency check during scanning. In addition, each Code 128
barcode includes a Modulo 103 checksum.
Calculating the checksum can be a little tricky. Each Code 128 character has a numeric
value from 0 to 102. In Subset A and B, the numeric value of a character is its ASCII code
minus 32. For instance, a space (ASCII 32) has a value of 0, the exclamation point (ASCII
33) has a value of 1, etc.
Subset A permits printing of ASCII control characters (ASCII codes between 0
and 31). For these characters, add 64 to the ASCII code to obtain the numeric value for
purposes of calculating the checksum. For example, the value of NUL (ASCII 0) is 64, SOH (ASCII 1) is 65, STX (ASCII 2) is 66, etc.
Subset C prints numeric digits in pairs, and the value of the character for checksum
purposes is the numeric value of the pair (00, 01, 02... 99).
To calculate the checksum, follow these steps:
Initialize the checksum variable with the value of the start character (103, 104, or 105
for Subsets A, B, or C, respectively).
- Initialize a multiplier to 1.
Starting at the left end of the barcode data, add the numeric value of each character
times the multiplier to the checksum. Increment the multiplier after each character.
- Divide the result by 103. The remainder is the checksum.
- Convert the numeric checksum into an ASCII character.
The details of converting the numeric checksum to an ASCII character may vary depending
on the particular font being used. Special handling may be required in cases where the
resulting ASCII character code equals zero or is above 95.
Generally speaking, in Subset A if the checksum is between 0 and 63 inclusive, add the
checksum and the ASCII code for a space (32) to obtain the character code. If the checksum
is 64 or higher, subtract 64 to obtain the character code. In Subset B, add the checksum
and the ASCII code for a space (32). In Subset C, the checksum is the ASCII value of the
Calculating Code 128 Barcode Checksum in FoxPro
Calculating a Code 128 Barcode Checksum in Access Basic
ASCII Control Codes in Code 128 Barcodes.