일반적으로 많이 사용되는 Code 128 바코드 체크비트 내용에 대해 알아보자.
CODE 128은 전체 ASCII 128 문자를 모두 표현할 수 있는 연속형 심벌로지이며, 수치 데이터는 심벌 문자당 두 자리로 표현한다. 1981년 Computer Identics Corp. 사에서 개발한 CODE 128은 현재 UPCSKS EAN등 데이터의 고밀도 표현을 요하는 여러 분야에서 응용, 사용되고 있다. CODE 12I9은 시작과 끝 문자, 변동 가능한 길이의 데이터, 바와 스페이스 두 개 모두에 대한 캐릭터 패리티, 체크 문자, 함수 문자 등으로 구성되어 있으며 인쇄가 보다 용이하며 현재 사용되고 있는 각종 컴퓨터, 프린터에 적당하다.
CODE 128의 심벌 구조는 좌우측 여백으로 인쇄돼지 않는 영역이 있고, 바코드화된 캐릭터의 연속은 단일한 시작 문자로 시작된다. 바로 옆에 가장 중요한 Most Significant가 오고 체크 문자 그리고 단일한 끝 문자가 온다.
CODE 128의 캐릭터 요소는 8개로 구성되며 각 요소들은 바 또는 바의 부분으로 이루어지면 각 캐릭터는 세 개의 바와 스페이스로 이루어진다. 각각의 바는 짝수 모듈(짝수 패리티)이고 스페이스는 홀수 모듈(홀수 패리티)로 이루어진다. 각 요소들의 폭은 1X, 2X, 3X, 4X의 네 가지로 바의 모듈은 '1'로, 여백의 모듈은 '0'으로 표시된다. 시작 문자는 세 종류의 문자 패턴(A, B, C)이 있으며 끝 문자는 네 개의 바와 세 개의 스페이스, 여기에 두 개의 모듈과 종료 바(2)가 합쳐져 13개의 모듈(13X)로 구성된다.
CODE 128의 코드 구조는 A, B, C 세 가지 문자 집합이 있는데 심벌 시작문자가 A로 시작되면 코드 A의 집합으로 정의된다. 심벌의 중간에 전이 문자(shift character)를 사용해 다른 문자 집합으로 옮길 수 있다. 문자 집합 A는 모든 alphanumeric 문자의 특수 문자, 컨트롤 문자를 포함하며 문자 집합 B는 모든 alphanumeric 문자와 특수 문자, 컨트롤 문자를 포함하는데 alphanumeric 문자들의 낮은 경우가 포함된다. 문자 집합 C는 00에서 99까지의 디지트쌍 100개와 특수 문자를 갖는데 문자마다 두 자리를 수치로 표현하므로 데이터의 밀도가 두 배이다. CODE 128에는 문자 집합 선택 문자(A, B, C), 전이 문자, 기능 문자가 모두 특수 문자로 존재하며, 한 개의 심벌 안에서 또는 한 개의 코드 부분 집합에서 다른 코드의 부분 집합으로 변화가 가능하다.
Code 128 3개의 각각 폭이 다른 검은 바와 흰 바가 조합되어 문자를 표시하는 1차원 바코드. 1981년 컴퓨터 아 이덴틱스사가 개발하였다. 문자 1개는 11 모듈로 구성되어있다. 모든 ASCII 문자를 지원하며 128∼255 범위의 문자도 입력 가능하다.7) Code 128은 심벌 폭의 최소화를 위해 동일한 문자를 서로 다른 코드 세 트(코드 세트 A, B, C)의 조합을 통하여 표현하는 알고리즘을 가지고 있다. 심벌의 길이는 정해져 있지 않지만 판독기의 용량을 감안하면 최대 약 48개 문자로 된 데이터를 저장할 수 있다.
참고 원문 :
https://en.wikipedia.org/wiki/Code_128
https://courses.cs.washington.edu/courses/cse370/01au/minirproject/ModusPeons/index.htm
https://www.adams1.com/128code.html
https://www.adams1.com/128table.html
Code 128 Structure
- Left Quiet Zone
- Start character
- Data characters: any length
- Checksum: one checksum in modulo 103
- Stop character
- Termination bar
- Right Quiet Zone
In ISO/IEC 15417 specification, the quiet zone should be at least ten times the width of the narrowest bar/space element. It is mandatory at the left and right side of the barcode.
Code 128 Encodable Character Set
- Code 128 A (Code Set A): 0-9, A-Z, and special characters
- Code 128 B (Code Set B): 0-9, A-Z, a-z, and special characters
- Code 128 C (Code Set C): numeric digit pairs 00-99 and three special characters
Code 128 Barcode Table Of Characters
(For the complete Code 128 specification, see the Code 128 Page)
The table below shows the three different character sets along with the decimal values of each character, which is used in calculating the Check Character. The final column shows the bar/space pattern for the character. The numbers indicate the number of modules wide the given space or bar is. To get the extended ASCII decimal, add 32 to the decimal value in the first column. There is a nice extended ASCII table here. Please note that Code 128 can only encode the English alphabet.
Value |
Code A |
Code B |
Code C |
Pattern B S B S B S |
What ASCII Code Do I Print? |
0 |
SP |
SP |
00 |
2 1 2 2 2 2 |
SP (ASCII 32) |
1 |
! |
! |
01 |
2 2 2 1 2 2 |
! (ASCII 33) |
2 |
" |
" |
02 |
2 2 2 2 2 1 |
" (ASCII 34) |
3 |
# |
# |
03 |
1 2 1 2 2 3 |
# (ASCII 35) |
4 |
$ |
$ |
04 |
1 2 1 3 2 2 |
$ (ASCII 36) |
5 |
% |
% |
05 |
1 3 1 2 2 2 |
% (ASCII 37) |
6 |
& |
& |
06 |
1 2 2 2 1 3 |
& (ASCII 38) |
7 |
' |
' |
07 |
1 2 2 3 1 2 |
' (ASCII 39) |
8 |
( |
( |
08 |
1 3 2 2 1 2 |
( (ASCII 40) |
9 |
) |
) |
09 |
2 2 1 2 1 3 |
) (ASCII 41) |
Value |
Code A |
Code B |
Code C |
Pattern B S B S B S |
|
10 |
* |
* |
10 |
2 2 1 3 1 2 |
* (ASCII 42) |
11 |
+ |
+ |
11 |
2 3 1 2 1 2 |
+ (ASCII 43) |
12 |
, |
, |
12 |
1 1 2 2 3 2 |
, (ASCII 44) |
13 |
- |
- |
13 |
1 2 2 1 3 2 |
- (ASCII 45) |
14 |
. |
. |
14 |
1 2 2 2 3 1 |
. (ASCII 46) |
15 |
/ |
/ |
15 |
1 1 3 2 2 2 |
/ (ASCII 47) |
16 |
0 |
0 |
16 |
1 2 3 1 2 2 |
0 (ASCII 48) |
17 |
1 |
1 |
17 |
1 2 3 2 2 1 |
1(ASCII 49) |
18 |
2 |
2 |
18 |
2 2 3 2 1 1 |
2 (ASCII 50) |
19 |
3 |
3 |
19 |
2 2 1 1 3 2 |
3 (ASCII 51) |
Value |
Code A |
Code B |
Code C |
Pattern B S B S B S |
|
20 |
4 |
4 |
20 |
2 2 1 2 3 1 |
4 (ASCII 52) |
21 |
5 |
5 |
21 |
2 1 3 2 1 2 |
5 (ASCII 53) |
22 |
6 |
6 |
22 |
2 2 3 1 1 2 |
6 (ASCII 54) |
23 |
7 |
7 |
23 |
3 1 2 1 3 1 |
7 (ASCII 55) |
24 |
8 |
8 |
24 |
3 1 1 2 2 2 |
8 (ASCII 56) |
25 |
9 |
9 |
25 |
3 2 1 1 2 2 |
9 (ASCII 57) |
26 |
: |
: |
26 |
3 2 1 2 2 1 |
: (ASCII 58) |
27 |
; |
; |
27 |
3 1 2 2 1 2 |
; (ASCII 59) |
28 |
< |
< |
28 |
3 2 2 1 1 2 |
< (ASCII 60) |
29 |
= |
= |
29 |
3 2 2 2 1 1 |
= (ASCII 61) |
Value |
Code A |
Code B |
Code C |
Pattern B S B S B S |
|
30 |
> |
> |
30 |
2 1 2 1 2 3 |
> (ASCII 62) |
31 |
? |
? |
31 |
2 1 2 3 2 1 |
? (ASCII 63) |
32 |
@ |
@ |
32 |
2 3 2 1 2 1 |
@ (ASCII 64) |
33 |
A |
A |
33 |
1 1 1 3 2 3 |
A (ASCII 65) |
34 |
B |
B |
34 |
1 3 1 1 2 3 |
B (ASCII 66) |
35 |
C |
C |
35 |
1 3 1 3 2 1 |
C (ASCII 67) |
36 |
D |
D |
36 |
1 1 2 3 1 3 |
D (ASCII 68) |
37 |
E |
E |
37 |
1 3 2 1 1 3 |
E (ASCII 69) |
38 |
F |
F |
38 |
1 3 2 3 1 1 |
F (ASCII 70) |
39 |
G |
G |
39 |
2 1 1 3 1 3 |
G (ASCII 71) |
Value |
Code A |
Code B |
Code C |
Pattern B S B S B S |
|
40 |
H |
H |
40 |
2 3 1 1 1 3 |
H (ASCII 72) |
41 |
I |
I |
41 |
2 3 1 3 1 1 |
I (ASCII 73) |
42 |
J |
J |
42 |
1 1 2 1 3 3 |
J (ASCII 74) |
43 |
K |
K |
43 |
1 1 2 3 3 1 |
K (ASCII 75) |
44 |
L |
L |
44 |
1 3 2 1 3 1 |
L (ASCII 76) |
45 |
M |
M |
45 |
1 1 3 1 2 3 |
M (ASCII 77) |
46 |
N |
N |
46 |
1 1 3 3 2 1 |
N (ASCII 78) |
47 |
O |
O |
47 |
1 3 3 1 2 1 |
O (ASCII 79) |
48 |
P |
P |
48 |
3 1 3 1 2 1 |
P (ASCII 80) |
49 |
Q |
Q |
49 |
2 1 1 3 3 1 |
Q (ASCII 81) |
Value |
Code A |
Code B |
Code C |
Pattern B S B S B S |
|
50 |
R |
R |
50 |
2 3 1 1 3 1 |
R (ASCII 82) |
51 |
S |
S |
51 |
2 1 3 1 1 3 |
S (ASCII 83) |
52 |
T |
T |
52 |
2 1 3 3 1 1 |
T (ASCII 84) |
53 |
U |
U |
53 |
2 1 3 1 3 1 |
U (ASCII 85) |
54 |
V |
V |
54 |
3 1 1 1 2 3 |
V (ASCII 86) |
55 |
W |
W |
55 |
3 1 1 3 2 1 |
W (ASCII 87) |
56 |
X |
X |
56 |
3 3 1 1 2 1 |
X (ASCII 88) |
57 |
Y |
Y |
57 |
3 1 2 1 1 3 |
Y (ASCII 89) |
58 |
Z |
Z |
58 |
3 1 2 3 1 1 |
Z (ASCII 90) |
59 |
[ |
[ |
59 |
3 3 2 1 1 1 |
[ (ASCII 91) |
Value |
Code A |
Code B |
Code C |
Pattern B S B S B S |
|
60 |
\ |
\ |
60 |
3 1 4 1 1 1 |
\ (ASCII 92) |
61 |
] |
] |
61 |
2 2 1 4 1 1 |
] (ASCII 93) |
62 |
^ |
^ |
62 |
4 3 1 1 1 1 |
^ (ASCII 94) |
63 |
_ |
_ |
63 |
1 1 1 2 2 4 |
_ (ASCII 95) |
64 |
NUL |
' |
64 |
1 1 1 4 2 2 |
` (ASCII 96) |
65 |
SOH |
a |
65 |
1 2 1 1 2 4 |
a (ASCII 97) |
66 |
STX |
b |
66 |
1 2 1 4 2 1 |
b (ASCII 98) |
67 |
ETX |
c |
67 |
1 4 1 1 2 2 |
c (ASCII 99) |
68 |
EOT |
d |
68 |
1 4 1 2 2 1 |
d (ASCII 100) |
69 |
ENQ |
e |
69 |
1 1 2 2 1 4 |
e (ASCII 101) |
Value |
Code A |
Code B |
Code C |
Pattern B S B S B S |
|
70 |
ACK |
f |
70 |
1 1 2 4 1 2 |
f (ASCII 102) |
71 |
BEL |
g |
71 |
1 2 2 1 1 4 |
g (ASCII 103) |
72 |
BS |
h |
72 |
1 2 2 4 1 1 |
h (ASCII 104) |
73 |
HT |
i |
73 |
1 4 2 1 1 2 |
i (ASCII 105) |
74 |
LF |
j |
74 |
1 4 2 2 1 1 |
j (ASCII 106) |
75 |
VT |
k |
75 |
2 4 1 2 1 1 |
k (ASCII 107) |
76 |
FF |
l |
76 |
2 2 1 1 1 4 |
l (ASCII 108) |
77 |
CR |
m |
77 |
4 1 3 1 1 1 |
m (ASCII 109) |
78 |
SO |
n |
78 |
2 4 1 1 1 2 |
n (ASCII 110) |
79 |
SI |
o |
79 |
1 3 4 1 1 1 |
o (ASCII 111) |
Value |
Code A |
Code B |
Code C |
Pattern B S B S B S |
|
80 |
DLE |
p |
80 |
1 1 1 2 4 2 |
p (ASCII 112) |
81 |
DC1 |
q |
81 |
1 2 1 1 4 2 |
q (ASCII 113) |
82 |
DC2 |
r |
82 |
1 2 1 2 4 1 |
r (ASCII 114) |
83 |
DC3 |
s |
83 |
1 1 4 2 1 2 |
s (ASCII 115) |
84 |
DC4 |
t |
84 |
1 2 4 1 1 2 |
t (ASCII 116) |
85 |
NAK |
u |
85 |
1 2 4 2 1 1 |
u (ASCII 117) |
86 |
SYN |
v |
86 |
4 1 1 2 1 2 |
v (ASCII 118) |
87 |
ETB |
w |
87 |
4 2 1 1 1 2 |
w (ASCII 119) |
88 |
CAN |
x |
88 |
4 2 1 2 1 1 |
x (ASCII 120) |
89 |
EM |
y |
89 |
2 1 2 1 4 1 |
y (ASCII 121 |
Value |
Code A |
Code B |
Code C |
Pattern B S B S B S |
|
90 |
SUB |
z |
90 |
2 1 4 1 2 1 |
z (ASCII 122) |
91 |
ESC |
{ |
91 |
4 1 2 1 2 1 |
{ (ASCII 123) |
92 |
FS |
| |
92 |
1 1 1 1 4 3 |
| (ASCII 124) |
93 |
GS |
} |
93 |
1 1 1 3 4 1 |
} (ASCII 125) |
94 |
RS |
~ |
94 |
1 3 1 1 4 1 |
~ (ASCII 126) |
95 (Hex 7F) |
US |
DEL |
95 |
1 1 4 1 1 3 |
DEL (ASCII 127) |
96 (Hex 80) |
FNC 3 |
FNC 3 |
96 |
1 1 4 3 1 1 |
Ç (ASCII 128) |
97 (Hex 81) |
FNC 2 |
FNC 2 |
97 |
4 1 1 1 1 3 |
ü (ASCII 129) |
98 (Hex 82) |
SHIFT |
SHIFT |
98 |
4 1 1 3 1 1 |
é (ASCII 130) |
99 (Hex 83) |
CODE C |
CODE C |
99 |
1 1 3 1 4 1 |
â (ASCII 131) |
100 (Hex 84) |
CODE B |
FNC 4 |
CODE B |
1 1 4 1 3 1 |
ä (ASCII 132) |
101 (Hex 85) |
FNC 4 |
CODE A |
CODE A |
3 1 1 1 4 1 |
à (ASCII 133) |
102 (Hex 86) |
FNC 1 |
FNC 1 |
FNC 1 |
4 1 1 1 3 1 |
å (ASCII 134) |
Value |
Start Code |
Pattern B S B S B S |
What ASCII Code Do I Print? |
103 (Hex 87) |
START (Code A) |
2 1 1 4 1 2 |
‡ (ASCII 135) |
104 (Hex 88) |
START (Code B) |
2 1 1 2 1 4 |
ˆ (ASCII 136) |
105 (Hex 89) |
START (Code C) |
2 1 1 2 3 2 |
‰ (ASCII 137) |
106 (Hex 6A) |
STOP (All Codes) |
2 3 3 1 1 1 2 |
Š (ASCII 138) |
Check Digit 계산 방법
ex) "BarCode 1" 에 대한 Code 128 Check Digit계산방법.
시작 코드셋이 START B일 경우 (START A:103, START B: 104, START C: 105)
START B = 104
B = 66 - 32 = 34
a = 97 - 32 = 65
r = 114 - 32 = 82
C = 67 - 32 = 35
o = 111 - 32 = 79
d = 100 - 32 = 68
e = 101 - 32 = 69
= 32 - 32 = 0
1 = 49 - 32 = 17
// 아래와 같이 자리수 별로 곱을한 값들을 모두 더하고 시작 코드셋 값으로 나눈 나머지 값이 Check Digit이 된다.
Total = 104 + (34x1) + (65x2) + (82x3) + (35x4) + (79x5) + (68x6) + (69x7) + (0x8) + (17x9) = 2093
Check Digit = 2093 mod 104 = 33(A)
= 33 + 32 = 65 = 'A' // 최종 출력 값은 32를 더한 값인 65('A')를 출력.
Final message : (START B)BarCode 1(A)(STOP)
2020/12/15 - [iOS/Tips] - 디버깅 차단 처리 (Anti Debug)
2020/12/14 - [iOS/Tips] - bundle id 알아내기
2020/12/12 - [AI/Algorithm] - 2D 충돌처리
2020/12/11 - [iOS/Swift] - UIViewController 스위칭
2020/12/11 - [개발노트] - PlantUML 설치 (Mac OS X)
2020/12/10 - [iOS/Objective-C] - 웹뷰에서 javascript 함수 동기식 호출
2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (2/2)
2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (1/2)
2020/12/10 - [iOS/Tips] - Custom UserAgent 설정
2020/12/10 - [iOS/Tips] - CocoaPods 설치 및 제거
2020/12/10 - [iOS/Tips] - Clang diagnostic 경고 무시하기
2020/12/10 - [개발노트] - Bluetooth UUID
2020/12/08 - [개발노트] - 모바일 앱 메모리덤프 이슈 해결방법
'개발 > Note' 카테고리의 다른 글
OpenSSL을 이용한 Key 정보 Text 변환 (0) | 2020.12.17 |
---|---|
RSA 암복호화 (0) | 2020.12.17 |
PlantUML 설치 (Mac OS X) (0) | 2020.12.11 |
특수문자 발음 (0) | 2020.12.11 |
Bluetooth UUID (0) | 2020.12.10 |