1차원 바코드 Code 128

총 108개의 문자를 표현할 수 있으며 시작(3) 종료(2)는 문자수에서 제외됩니다.
BARCODE의 구성원리는 알아보았으니 실직적으로 code128의 원리를 파보도록 하겠습니다.
code128의 사양(Specification)

그림처럼 총 6개의 구역으로 이루어져 있습니다.

1.Quiet zone
2.Start symbol
3.Encoded data
4.Check symbol
5.Stop symbol
6.Final bar (often considered part of the stop symbol)
7.Quiet zone

Quiet zone

Quiet zone은 바코드의 앞/뒤에 존재하게 되며 특별히 code128이 아니더라도 모든 바코드에서는 앞/뒤 여백이 있어야 합니다…사실 표준기관에 quiet zone spec을 보면 반드시 아무것도 인쇄해서는 안되는 영역이며 반드시 보장되어야 하는 영역이라고 명시되어 있습니다.
(약식 바코드 까지 EAN-8? 같은 것도 포함되는지는 모르겠네요)

보통 내용문자 *10의 크기를 가져야 합니다.

이 영역이 사실 디코딩 수준을 결정하기에 딱1개의 양쪽에 *10크기로 비워 라는 아니긴 합니다만, Normal, More Aggressive, One Side EB, Anything 등의 디코딩을 위한 방식이 있으나..넘어가도록 하겠습니다 일단은 양쪽에 *10 크기로 비우는 걸로 ㅎ

Start symbol

존재목적이라 함은…이제 바코드가 시작된다를 알립니다…허무한가요..;;

code 128에는 3종류의 codeset이 존재합니다, 128a, 128b, 128c라고 한다고 저는 알고있는데 이게 정말 공식적인 명칭인지는 확실하지 않으니 이부분이 궁금하시면 따로 확인을 해보시면 될 듯 합니다…저는 딱히 안 궁금해서 ㅠㅠ

– 2018-11-02 추가 시작
Code 128 A: Partial ASCII set, no lower case, but ASCII control chars (TAB, CR/LF etc.)
Code 128 B: Full ASCII set, no ASCII control chars
Code 128 C: Only digits 0-9, encoded in pairs, very compact code
A,B,C 의 명칭이 그 닥 공식화 되어있지 않지만 대충 A,B,C라고 부르네요 그냥 다들 ㅡㅡ;;
각 코드셋이 수용할 수 있는 범위가 명시 되어있는 정보를 찾아서 내용을 추가합니다.
– 2018-11-02 추가 끝


code128 codeset별 codevalue 참고

코드표에서 보면 Start Code A(211412), Start Code B(211214), Start Code C(211232)
가 명시 되어있는 것을 확인하실 수 있습니다.
예를 들어 Start Code B(211214)
11010010000 211214 는
검검흰검흰흰검흰흰흰흰 으로 이루어진
■■□■□□■□□□□ 처럼 생긴 바코드로 표현이 되겠지요

Encoded data

여긴 말그대로 데이터입니다.
소스로 구현시에는 가장 복잡하게? 들어가겠죠 ㅎ?, 데이터 다루는 부분은 따로 정리하겠습니다.

Check symbol

체크섬 공식에 의한 검증코드값이 같이 들어갑니다, 이건 메세지가 리더기에서 정확하게 읽혔는가 검증하기위한 값이라고 생각하시면 됩니다.

문자열의 자리 수 * 문자 값 들의 합에 103으로 나눈 나머지에 해당하는 코드 값이 code128에서 Check symbol 값이 되겠습니다.

LeeJungKyu <- 이건 나중에 소스에서 다시 설명 드리겠지만 codeset A냐 codeset B냐의 검증을 거쳐보면 codeset B라는 결론이 나는 문자열입니다..해서!!!

LeeJungKyu 문자열을 Start Code B로 시작하는 값을 code128로 한번 만들어 보겠습니다.

L : 첫번째 자리니까 1 * L의 문자 값 => 1 * 44

??? : 여기서 왜 L의 문자 값이 44인가 갑자기 이해가 안가시는 분들은 barcode 128 codeset 가셔서 128B값에 대문자 L 인곳으로 가보시면

Value 128A 128B 128C Font position
(Common/Barcodesoft) Bar/Space
Code Latin-1 Pattern Widths
44 L L 44 76 L 10001101110 132131

뙇 하고 확인하실 수 있습니다.

그럼 다시 정리해 보겠습니다.

L : 첫번째 자리니까 1 * L의 문자 값 => 1 * 44 = 44
e : 두번째 자리니까 2 * e의 문자 값 => 2 * 69 = 138 ( 사실 여기에서 힌트가 codeset A에선 소문자 e 표현이 없습니다 )
e : 세번째 자리니까 3 * e의 문자 값 => 3 * 69 = 207
J : 네번째 자리니까 4 * J의 문자 값 => 4 * 42 = 168
u : 다섯번 째 자리니까 5 * u의 문자 값 => 5 * 85 = 425
n : 여섯 번째 자리니까 6 * n의 문자 값 => 6 * 78 = 468
g : 일곱 번째 자리니까 7 * g의 문자 값 => 7 * 71 = 497
K : 여덟 번째 자리니까 8 * K의 문자 값 => 8 * 43 = 344
y : 아홉 번째 자리니까 9 * y의 문자 값 => 9 * 89 = 801
u : 열 번째 자리니까 10 * u의 문자 값 => 10 * 85 = 850

분명 공식은 문자열의 자리 수 * 문자 값 들의 합에 103으로 나눈 나머지 라 했습니다 ㅋ

2018-11-16 추가 및 수정 ** 중요
체크섬계산에 관한 엄청난 잘못된 점이 있어서 ㄷㄷ…수정합니다
다른 건 틀린 게 없는데 더할 때 맨처음에 StartSymbol 의 문자 값(Value)을 더해야 합니다, 그러니…결국 ㅠㅠ Checksum 값이 여기서 먼저 보신분처럼 하면 다르겠죠 결국 그걸로 바코드 찍히긴 합니다만….검증시에 계속 에러가 나고있었네요…. 죄송합니다 ㅠㅠ


그러면!!!
104(Start Code B 의 Value) + 44 + 138 + 207 + 168 + 425 + 468 + 497 + 344 + 801 + 850 = 3,942 4,046

3,942를 103으로 나누면 = 38.271844660194176
4,046을 103으로 나누면 = 39.2815533980583

참고 : 여기서 나머지를 구하는건 나머지를 구하는 알고리즘을 따로 찾아보시기 바랍니다.(산수시간인가요 ㅎㅎ?)

여기서 몫 : 38 / 나머지 : 28
여기서 몫 : 39 / 나머지 : 29

이란 결과를 얻을 수 있습니다, 그럼 2829 이 표현되는 codeset B에 <= 기호가 Check symbol이 되겠습니다.!!!!

Start symbol/LeeJungKyu<=/Stop symbol

최종 이런 모습이 데이터가 되겠네요..나중에 확인했는데 틀리면 망신인데요…..
하…다시 노가다를

Start Code B : 211214 => 11010010000

L : 132131 => 10001101110
e : 112214 => 10110010000
e : 112214 => 10110010000
J : 112133 => 10110111000
u : 124211 => 10011110010
n : 241112 => 11000010100
g : 122114 => 10011010000
K : 112331 => 10110001110
y : 212141 => 11011011110
u : 124211 => 10011110010
< : 322112 => 11100110100
= : 322211 => 11100110010

Stop pattern : 2331112 => 1100011101011
LeeJungKyu 란 문자를 code128식의 바코드 형태로 변경하면
2112141321311122141122141121331242112411121221141123312121411242113221123222112331112
가 되는 겁니다 .

마지막으로 패턴으로 변경하면
110100100001000110111010110010000101100100001011011100010011110010110000101001001101000010110001110110110111101001111001011100110100111001100101100011101011

0과 1로 그림을 그리는데 1개의 숫자는 일정한 사이즈로 선을 그립니다 여기서 맨 처음 Quiet zone 을 다시 생각해보면 1개의 숫자가 그어지는 선의 10배만큼씩 좌우로 여백을 주고 안에다 그려야 한다는 말이었다고 이해가 되시는 지 모르겠습니다.

왜 도대체 2331112가 1100011101011로 변환되는가를 고민하시는 분들이 계실 까봐…
barcode 128 codeset 여기를 다시 보시죠 자세히..ㅋㅋ
Widths죠? Pattern이고요 Widths는 규칙이 있습니다..사실 이게 저도 정확하게 궁금한 부분인데 Widths값이 Pattern값으로 변환되는 규칙은 저는 BWB(Black White Black)으로 외워서 알고있거든요…깊게 찾아보지 않고 그냥 그렇게 외우고 있습니다 ㅠㅠ
즉 말해서 블랙화이트블랙순으로 Widths의 값만큼 그리는 겁니다 블랙을 1 화이트를 0으로 하면
2331112를 풀어 말하면 블랙2 화이트3 블랙3 화이트1 블랙1 화이트1 블랙2 이렇게 되는 거죠 이걸 그대로 0과1로 표현하되 1이상의 숫자는 반복하는 거로 적으면 그냥
1100011101011 이 됩니다 ㅋㅋ 잘 아시는 분 댓글 좀 제가 잘못 알고 있는 거면 전 망했네요..

숫자가 연속되면 두꺼워지는 것 처럼 보이겠죠 바코드에서 많이 보던 느낌 살아나죠?

실제로 바코드로 그려진 이미지 입니다, 만약!! 아주 만약 정말 이걸 수작업으로 오차없이 그리실 수 있다고 하면(사실 바코드가 선의 농도도 체크한다는데..이건 나중에 알아봐야 할 듯합니다) 재미삼아 해보세요..

요즘은 리더기 아니더라도 앱으로 리더기들이 많아서 찍어 보시면 재미있을지도 모릅니다 - _-

Stop symbol

사실 위에서 다뤘습니다..순서도 뒤죽박죽이네요 ㅋㅋ 이것 역시 마지막이라는 신호입니다.

우선 이론 편…여기서 마치겠습니다
왜???이론 편이냐??????
전 이거 그냥 공부하려고 정리한 건 아니거든요 ㅡㅡ;;
이 1차원 바코드 그리러 Visual Studio 켜야 지 않겠습니까 ㅋ?
감사합니다.