안녕하세요.
공정에서 사용할 바코드 프로그램을 만들어 생성하고 있는데 특정 문자열이 리딩이 되지 않는 현상이
있어 문의드립니다.
바코드를 리딩되게 하려면 문자열을 변환해야 하는데 Code 128 B 의 체크섬 결과값이 아스키코드를 벗
어나 체크섬 값을 얻지 못해 리딩이 되지 않는 현상이 발생하네요.
체크섬 계산에 아스키코드를 벗어나는 값이 산출되면 한번더 계산을 해야하는데 그 감가식을 모
르겠네요. 혹시 이걸 해결하는 방법을 아시는 분이 계실까요??
아래코드는 체크섬을 산출하는 코드입니다.
(content 길이가 길다며 텍스트를 추가할 수 없어 이미지로 대체합니다.)
27개의 답변이 있습니다.
이 질문이 다시 생각나서...
파이썬으로 직접 코딩 한번 해 보았네요.
Code 128 폰트는 아래 링크에서 다운 받아서 사용했고요.
https://fontmeme.com/ktype/code-128-font/
이 폰트에 코드값을 0에서 부터 출력을 쭉 해보니...
32~126까와 195~207까지에 바코드가 매칭되어 있더군요.
코드 128 바코드 패턴값과 다운 받은 폰트를 직접 출력해 본 바코드를 비교해 본 결과...
Code 128 코드 0 ~ 94가 32~126까지 매칭하고, 95~107이 195~207까지 매칭하더군요.
Start Code A 103 값이 203에 매칭
Start Code B 104 값이 204에
Start Code C 105 값이 205에
그리고,
Stop 106 값이 206에 매칭한다는 것을 확인 했고요.
파이썬 코드를 아래와 같이 간단하게 만들어서 Test 했네요.
=====================
import tkinter as tk
def check_sum( st_code, data ):
ck_sum = st_code #Check SUM 초기화 ( Start code 값을 입력 )
c = 0
for i in data :
c += 1
val = ord( i ) - 32 # Data 문자열 각각의 문자에 대한 Code 128 값 계산
ck_sum += val * c # 체크섬 값 계산
#
return ck_sum % 103 # 계산한 체크섬 돌려줌
#
def val2bar( val ):
if val < 95 :
bar_ch = val + 32
else :
bar_ch = val + 100
#
return bar_ch
data = "82-BgDeFH"
code_a = 103
code_b = 104
code_c = 105
stop128 = 106
ck_value = check_sum( code_b, data )
print( ck_value )
window = tk.Tk()
window.geometry('280x200')
bar_data = chr( val2bar( code_b ) ) + data + chr( val2bar( ck_value ) ) + chr( val2bar( stop128 ) )
label = tk.Label(window, text=bar_data,
font=('code 128', 40))
label.place(x=30, y=50)
window.mainloop()
======================
Check SUM 값이 100이 나오도록
82-BgDeFH
넣어서 바코드를 만들었고요.
바코드는 아래와 같이 생성되게 되고요.
바코드 리더기에서도 잘 읽어 집니다.
코드 128 코드값 하나하나에 대한 대응하는 바코드를 화면에 출력해는 코드를 아래와 같이 만들었습니다.
아래 코드도 참조하면 도움이 많이 될 수 있을 것 같네요.
==================
import tkinter as tk
window = tk.Tk()
window.geometry( '1000x900' )
for i in range( 0, 300 ):
x_p = int ( i / 40 ) * 50
y_p = i % 40
label1 = tk.Label(window, text=str(i+32), font=( 'Arial', 10 ) )
label1.place( x = x_p, y = y_p * 20 )
label = tk.Label(window, text=chr ( i+32 ), font=('code 128', 39) )
label.place(x = x_p + 25, y = y_p * 20 )
#
window.mainloop()
======================
안녕하세요. CNYTAI0008 변환해보시겠어요?? 저도 다 잘 변환이 되는데 문자열에 따라 변환이 되었다 안되었다 합니다.
바코드가 아래와 같이 나옵니다.
체크섬 100 이 나오고요.
아래 링크의 바코드 폰트를 이용해서
https://fontmeme.com/ktype/code-128-font/
제시한 C# 코드는 아래와 같이 작성하시면 될 것 같습니다.
=========================
intSUM = intSOD;
intpBARCODE = barcodeStr.length;
int intVAL;
for( int i=0; i < intpBARCODE; i++ )
{
intVAL = barcodeStr[i] - 32;
intSUM += intVAL * ( i + 1 );
}
intMMM = intSUM % intMOD;
if ( intMMM > 94 )
{
strSUM = Char.ToString((char)(intMMM + 100));
}
else
{
strSUM = Char.ToString((char)(intMMM + 32 ));
}
=========================
여러번 테스트 해봤지만 혹시나 하는 기대에 wansoo님께서 알려주신 로직과 폰트를 적용을 해봤습니다. 문제가 되었던 문자열은 올바르게 나오지만 다른 문자들이 바코드가 깨지네요 ㅠㅠ
폰트를 아래 링크에서 다운 받은걸로 해 보셨나요?
현재 사용중인 code 128 폰트를 제거하고,
https://fontmeme.com/ktype/code-128-font/ 에서 폰트를 다운 받아서 설치해서 사용해 보세요.
아니면 지금 사용중인 폰트를 보내 주시면, 로직을 찾아 봐 드릴 수도 있을 것 같습니다.
CNYTAI0006 체크섬 : 80
CNYTAI0005 체크섬 : 70
CNYTAI0006 와 CNYTAI0005은 체크섬이 80과 70으로 94 이하의 값인데도 체크섬에 대한 바코드가 제대로 표시되지 않는다면...
바코드 폰트에 문제일 가능성 보다는...
체크섬을 바코드로 변환할때까지의 과정중에 잘못된 처리로 하고 있을 가능성이 높아보입니다.
코드 전체를 알려 주시면 문제점을 찾아 봐 드릴 수도 있을 것 같습니다.
체크섬이 70이면, 체크섬 부분에 f, 체크섬이 80이면 체크섬 부분에 p가 들어 가야 합니다.
아 다시 확인해보니 이리저리 해보니라 주석처리를 한게 있었네요 ㅎㅎ;; 조건절에 체크섬 결과값에서 비교하는 값에 32를 더해서 구해버렸네요 ㅎㅎ 다시 해보니 정상적으로 나옵니다. 해당폰트는 따로 저장을 해두었습니다. 감사합니다~!!
수고하셨습니다~ ^^
댓글 남기기
답변을 작성 하시려면 로그인이 필요합니다.
로그인 회원가입덕분에 자료 잘 보았습니다.
댓글 남기기
답변을 작성 하시려면 로그인이 필요합니다.
로그인 회원가입code 128 코드의 값이 1~106의 값을 가지는데,
ASCII 코드 값으로 바코드를 표현할때
95 이상의 문자에 대해서는 ASCII 코드 227 이상의 값으로 매칭 시켜 바코드로 표현하고 있기 때문에...
체크섬이 95 이상의 값에 대해서는 132를 더해 줘서 표현해 주면 되겠네요.
제시하신 코드는 아래와 같은 형식으로 작성하면 되지 않을까 싶어 보입니다.
intSUM = insSOD;
intBARCODE = barcodeStr.length;
int intVAL;
for( int i=0; i < intpBARCODE; i++ )
{
intVAL = barcodeStr[i] - 32;
intSUM += intVAL * ( i + 1 );
}
intMMM = intSUM % intMOD;
if ( intMMM > 94 )
{
strSUM = Char.ToString((char)(intMMM + 132 );
}
else
{
strSUM = Char.ToString((char)(intMMM + 32 );
}
Code 128 Value (For Check Character)
Code 128 A
Code 128 B
Code 128 C
Barcode Font Character
0
' '
' '
00
' ' (Space)
1
'!'
'!'
01
'!'
2
'"'
'"'
02
'"'
3
'#'
'#'
03
'#'
4
'$'
'$'
04
'$'
5
'%'
'%'
05
'%'
6
'&'
'&'
06
'&'
7
'''
'''
07
'''
8
'('
'('
08
'('
9
')'
')'
09
')'
10
'*'
'*'
10
'*'
11
'+'
'+'
11
'+'
12
','
','
12
','
13
'-'
'-'
13
'-'
14
'.'
'.'
14
'.'
15
'/'
'/'
15
'/'
16
'0'
'0'
16
'0'
17
'1'
'1'
17
'1'
18
'2'
'2'
18
'2'
19
'3'
'3'
19
'3'
20
'4'
'4'
20
'4'
21
'5'
'5'
21
'5'
22
'6'
'6'
22
'6'
23
'7'
'7'
23
'7'
24
'8'
'8'
24
'8'
25
'9'
'9'
25
'9'
26
':'
':'
26
':'
27
';'
';'
27
';'
28
'<'
'<'
28
'<'
29
'='
'='
29
'='
30
'>'
'>'
30
'>'
31
'?'
'?'
31
'?'
32
'@'
'@'
32
'@'
33
'A'
'A'
33
'A'
34
'B'
'B'
34
'B'
35
'C'
'C'
35
'C'
36
'D'
'D'
36
'D'
37
'E'
'E'
37
'E'
38
'F'
'F'
38
'F'
39
'G'
'G'
39
'G'
40
'H'
'H'
40
'H'
41
'I'
'I'
41
'I'
42
'J'
'J'
42
'J'
43
'K'
'K'
43
'K'
44
'L'
'L'
44
'L'
45
'M'
'M'
45
'M'
46
'N'
'N'
46
'N'
47
'O'
'O'
47
'O'
48
'P'
'P'
48
'P'
49
'Q'
'Q'
49
'Q'
50
'R'
'R'
50
'R'
51
'S'
'S'
51
'S'
52
'T'
'T'
52
'T'
53
'U'
'U'
53
'U'
54
'V'
'V'
54
'V'
55
'W'
'W'
55
'W'
56
'X'
'X'
56
'X'
57
'Y'
'Y'
57
'Y'
58
'Z'
'Z'
58
'Z'
59
'['
'['
59
'['
60
'\'
'\'
60
'\'
61
']'
']'
61
']'
62
'^'
'^'
62
'^'
63
'_'
'_'
63
'_'
64
NUL
'`'
64
'`'
65
SOH
'a'
65
'a'
66
STX
'b'
66
'b'
67
ETX
'c'
67
'c'
68
EOT
'd'
68
'd'
69
ENQ
'e'
69
'e'
70
ACK
'f'
70
'f'
71
BEL
'g'
71
'g'
72
BS
'h'
72
'h'
73
HT
'i'
73
'i'
74
LF
'j'
74
'j'
75
VT
'k'
75
'k'
76
FF
'l'
76
'l'
77
CR
'm'
77
'm'
78
SO
'n'
78
'n'
79
SI
'o'
79
'o'
80
DLE
'p'
80
'p'
81
DC1
'q'
81
'q'
82
DC2
'r'
82
'r'
83
DC3
's'
83
's'
84
DC4
't'
84
't'
85
NAK
'u'
85
'u'
86
SYN
'v'
86
'v'
87
ETB
'w'
87
'w'
88
CAN
'x'
88
'x'
89
EM
'y'
89
'y'
90
SUB
'z'
90
'z'
91
ESC
'{'
91
'{'
92
FS
'|'
92
'|'
93
GS
'}'
93
'}'
94
RS
'~'
94
'~'
95
US
DEL
95
227 (ASCII value)
96
FNC3
FNC3
96
228 (ASCII value)
97
FNC2
FNC2
97
229 (ASCII value)
98
Shift
Shift
98
230 (ASCII value)
99
Code C
Code C
99
231 (ASCII value)
100
Code B
FNC4
Code B
232 (ASCII value)
101
FNC4
Code A
Code A
233 (ASCII value)
102
FNC1
FNC1
FNC1
234 (ASCII value)
103
Start A
Start A
Start A
235 (ASCII value)
104
Start B
Start B
Start B
236 (ASCII value)
105
Start C
Start C
Start C
237 (ASCII value)
106
Stop
Stop
Stop
238 (ASCII value)
댓글 남기기
답변을 작성 하시려면 로그인이 필요합니다.
로그인 회원가입체크섬이란 개념과 Code 128에 대한 개념이 없으신 분들이 많을 것 같아...
제가 알고 있는 범위에서 정리해 보겠습니다.
먼저...
CODE 128은 영문 대문자와 제어 코드를 처리하기 위한 A 코드와 영문 대문자, 소문자 모두를 처리하기 위한 B 코드, 숫자를 처리하기 위한 용도의 C 코드로 분간해서 목적에 따라 서로 혼용해서 사용할 수도 있고...
CODE 39와 달리 체크 섬이 포함되어 있어 바코드를 읽었을 때 정상적인 바코드인지 점검할 수 있다는 장점이 있는 바코드로 오류를 허용하지 않는 중요 용도로 선호하는 바코드가 되겠는데요.
체크섬이란 것이 무엇이냐면...
체크 디지트라고 표현하기도 한데...
주민번호도 제일 끝자리 숫자가 Check Digit에 해당한 값이죠.
(주민번호도 자리수 가중치를 곱해서 Check Digit를 계산하기 때문에 Code 128 Check sum 계산과 유사점이 있음)
생성된 코드가 정상적인지 어떤지를 점검하기 위한 코드에 해당합니다.
바코드를 리더기에서 읽었을 때 바코드 훼손 등에 의해 잘못된 바코드인지 어떤지를 점검하기 위한 용도로 사용되게 되겠고요.
체크섬은 점검용 값이기 때문에 전달자(생성자)와 수신자(리더기)가 동일하게 약속된 방식으로 계산해야 하는 값이어야 하죠.
Code 128 바코드에서 문자에 할당될 수 있는 값의 범위는 0~102까지 103개 입니다.
체크섬 값도 0~102까지 범위 안에 있는 값이고요.
0~102에 해당하는 값을 생성하기 위해서 103으로 나누어서 나머지를 체크섬으로 사용하게 되는 것이고요.
코드 128의 체크 섬을 수작업 계산해 볼께요.
Start Code A는 103, Start Code B는 104, Start Code C는 105가 되겠는데...
여기서는 Code 128B이기 때문에 Start Code B에 해당하는 바코드를 제일 앞에 포함시켜야 하겠고요.
intSOD = 104가 되게 되고,
intSUM = 104 가 입력되어 초기화 되게 됩니다.
barcodeStr = "Shared IT" 라고 해볼께요.
barcodeStr.length = 9가 되겠죠.
주석 처리해뒀는데...
intpBARCODE = 9 가 되어 줘야 for 반복문이 barcodeStr 전체 문자에 대해 처리를 할 수 있게 되겠고요.
intpBARCODE=barcodeStr.length 의 앞부분에 주석을 제거하여
intpBARCODE = 9 로 해서 for 반복문을 수행하게 되며..
반복문 안에서
intVAL = 0 으로 초기화 시켜 주게 되는데...
이부분은... for 문 밖에서 int intVAL 이라고 선언해 주는 것이 보기에도 좋고, 성능면에도 긍정적이겠고요.
intVAL = barcodeStr[i] 에 의해서 "Shared IT"의 제일 앞의 "S" 부터 ASCII 코드 값이 추출되어 intVAL에 할당되게 되겠고요.
intVAL = intVAL - 32 에 의해서 ASCII 코드 값이 CODE 128B에 해당하는 값으로 변환되게 되고요.
intSUM = intSUM + intVAL * ( i + 1 ) 에 의해서 각자리 가중치를 곱해서 체크섬을 계산 하게 되는데...
Shared IT 에 대해서 계산해 보면 아래와 같이 변하게 되겠죠.
Start Code B : 104
ASCII 코드값 intVAL I+1 intSUM
S 83 51 1 155
h 104 72 2 299
a 97 65 3 494
r 114 82 4 822
e 101 69 5 1167
d 100 68 6 1575
32 0 7 1575
I 73 41 8 1903
T 84 52 9 2371
와 같이 반복문에 의해 계산 되어, for 문을 빠져 나올때 intSUM = 2371 이 되겠고요.
intMMM = intSUM % intMOD 계산에서...
intMOD는 Code 128의 일반 문자가 가질수 있는 값의 범위인 0~102 내에서 체크 섬을 생성하기 위해 103의 값을 할당해서 사용하게 되기 때문에
intMMM = 2371 % 103 을 해서 intMMM = 2가 되게 됩니다.
여기서 사용된 intMMM 값을 그대로 체크 섬으로 사용하면 되고,
이 값을 ASCII 코드에 매칭해서 화면에 표시해 보고 싶다면 이 값에 32를 더해서 화면에 출력해 보면 되겠지만...
체크섬은 점검을 위한 값이기 때문에... 굳이 ASCII 코드로 변환해서 화면에 표시해 볼 필요는 없을 거라 생각되네요.
안녕하세요. 말씀하신 체크섬은 리딩시 문자로 표기되지 않지만 바코드에는 바 형태로 표기가 됩니다. 해당 체크섬의 결과를 문자로 변환하여 바형태로 표기가 되고 문자의 코드표를 기준으로 체크섬을 가져와 전체 문자열과 비교를 합니다. 바 구성은 [startCode][Text][checksum][endCode] 설명대로 startCode는 A,B,C에 따라 고정값이 쓰여지고 endCode는 동일 고정값입니다. 지금 문제는 checksum 값이 아스키코드 값을 벗어나서 인지 checksum에 표기되어야할 바가 누락되는 현상입니다.
if ( intMMM > 94 ) {
intMMM += 132
)
로 표현하면 될 것 같네요.
아래 표를 참고하면 도움이 될 것 같네요.
Code 128 Value (For Check Character)
Code 128 A
Code 128 B
Code 128 C
Barcode Font Character
0
' '
' '
00
' ' (Space)
1
'!'
'!'
01
'!'
2
'"'
'"'
02
'"'
3
'#'
'#'
03
'#'
4
'$'
'$'
04
'$'
5
'%'
'%'
05
'%'
6
'&'
'&'
06
'&'
7
'''
'''
07
'''
8
'('
'('
08
'('
9
')'
')'
09
')'
10
'*'
'*'
10
'*'
11
'+'
'+'
11
'+'
12
','
','
12
','
13
'-'
'-'
13
'-'
14
'.'
'.'
14
'.'
15
'/'
'/'
15
'/'
16
'0'
'0'
16
'0'
17
'1'
'1'
17
'1'
18
'2'
'2'
18
'2'
19
'3'
'3'
19
'3'
20
'4'
'4'
20
'4'
21
'5'
'5'
21
'5'
22
'6'
'6'
22
'6'
23
'7'
'7'
23
'7'
24
'8'
'8'
24
'8'
25
'9'
'9'
25
'9'
26
':'
':'
26
':'
27
';'
';'
27
';'
28
'<'
'<'
28
'<'
29
'='
'='
29
'='
30
'>'
'>'
30
'>'
31
'?'
'?'
31
'?'
32
'@'
'@'
32
'@'
33
'A'
'A'
33
'A'
34
'B'
'B'
34
'B'
35
'C'
'C'
35
'C'
36
'D'
'D'
36
'D'
37
'E'
'E'
37
'E'
38
'F'
'F'
38
'F'
39
'G'
'G'
39
'G'
40
'H'
'H'
40
'H'
41
'I'
'I'
41
'I'
42
'J'
'J'
42
'J'
43
'K'
'K'
43
'K'
44
'L'
'L'
44
'L'
45
'M'
'M'
45
'M'
46
'N'
'N'
46
'N'
47
'O'
'O'
47
'O'
48
'P'
'P'
48
'P'
49
'Q'
'Q'
49
'Q'
50
'R'
'R'
50
'R'
51
'S'
'S'
51
'S'
52
'T'
'T'
52
'T'
53
'U'
'U'
53
'U'
54
'V'
'V'
54
'V'
55
'W'
'W'
55
'W'
56
'X'
'X'
56
'X'
57
'Y'
'Y'
57
'Y'
58
'Z'
'Z'
58
'Z'
59
'['
'['
59
'['
60
'\'
'\'
60
'\'
61
']'
']'
61
']'
62
'^'
'^'
62
'^'
63
'_'
'_'
63
'_'
64
NUL
'`'
64
'`'
65
SOH
'a'
65
'a'
66
STX
'b'
66
'b'
67
ETX
'c'
67
'c'
68
EOT
'd'
68
'd'
69
ENQ
'e'
69
'e'
70
ACK
'f'
70
'f'
71
BEL
'g'
71
'g'
72
BS
'h'
72
'h'
73
HT
'i'
73
'i'
74
LF
'j'
74
'j'
75
VT
'k'
75
'k'
76
FF
'l'
76
'l'
77
CR
'm'
77
'm'
78
SO
'n'
78
'n'
79
SI
'o'
79
'o'
80
DLE
'p'
80
'p'
81
DC1
'q'
81
'q'
82
DC2
'r'
82
'r'
83
DC3
's'
83
's'
84
DC4
't'
84
't'
85
NAK
'u'
85
'u'
86
SYN
'v'
86
'v'
87
ETB
'w'
87
'w'
88
CAN
'x'
88
'x'
89
EM
'y'
89
'y'
90
SUB
'z'
90
'z'
91
ESC
'{'
91
'{'
92
FS
'|'
92
'|'
93
GS
'}'
93
'}'
94
RS
'~'
94
'~'
95
US
DEL
95
227 (ASCII value)
96
FNC3
FNC3
96
228 (ASCII value)
97
FNC2
FNC2
97
229 (ASCII value)
98
Shift
Shift
98
230 (ASCII value)
99
Code C
Code C
99
231 (ASCII value)
100
Code B
FNC4
Code B
232 (ASCII value)
101
FNC4
Code A
Code A
233 (ASCII value)
102
FNC1
FNC1
FNC1
234 (ASCII value)
103
Start A
Start A
Start A
235 (ASCII value)
104
Start B
Start B
Start B
236 (ASCII value)
105
Start C
Start C
Start C
237 (ASCII value)
106
Stop
Stop
Stop
238 (ASCII value)
안녕하세요. 답변을 드린다는게 이걸해결하니라 이제야 답변을 남기네요. 혹시나 추후에 이 게실글을 참고하시는 분이 계실까해서 추가 답변을 남기네요. 해당 코드표를 보고 요리저리 재계산을 굴려봤지만 체크섬 결과가 바 형태로 표기가 안되거나 억지로 아스키 코드 값에 들어오도록 해봤지만 체크섬 결과가 전체 문자열에 대한 계산과 맞지 않아 리딩이 되질 않습니다. 여튼 체크섬 계산식에 의해 결과가 코드표 좌측의 code 128 value가 95 이상이 나오면 이는 아스키 코드 126을 벗어나 바코드 폰트에서 이를 표현할 수가 없거나 표현이 된다해도 운영체제에 따라 인식을 못합니다. (stackoverflow를 참고하면 바코드 폰트의 인코딩 형식에 따라 표현이 되거나 안될 수도 있고 운영체제의 캐릭터셋도 영향을 끼침 ) 또한 이건 제 개인적인 생각이지만 코드표의 code 128 value 값 95 ~ 106은 예약어로 추정되어 체크섬 값으로 사용을 할 수가 없는 것 같습니다. 질문글의 결과가 code 128 value 값 100인데 이는 Code 128 B 에서 FNC4 입니다. 따라서 바코드 폰트를 이용하여 바코드를 표현하실 분들은 체크섬 결과에 따라 바코드의 바가 누락되거나 정상적으로 표현이 되지 않는 경우가 있으며 가급적 code 39를 이용하시는게 좋을 듯 하며 난 대소문자가 꼭 필요하다 하시는 분들은 바코드 폰트를 이용하지 마시고 바코드 라이브러리를 추가해서 변환하여 이용하시는게 여러모로 수월합니다. wansoo님 자료가 많은 참조가 되었네요 감사합니다~!
아래 위키피디아 자료를 참고해 보면 도움이 될 것 같아 보이네요.
Code 128 - Wikipedia
Value
Hex value
128A
128B
128C
Font position
(Common/Uncommon/Barcodesoft)
Bar/Space
Code
Latin-1
Pattern
Widths
0
00
space
space
00
32 or 194 or 207 / 212 / 252
␣ or  or Ï / Ô / ü
11011001100
212222
1
01
!
!
01
33
!
11001101100
222122
2
02
"
"
02
34
"
11001100110
222221
3
03
#
#
03
35
#
10010011000
121223
4
04
$
$
04
36
$
10010001100
121322
5
05
%
%
05
37
%
10001001100
131222
6
06
&
&
06
38
&
10011001000
122213
7
07
'
'
07
39
'
10011000100
122312
8
08
(
(
08
40
(
10001100100
132212
9
09
)
)
09
41
)
11001001000
221213
10
0a
*
*
10
42
*
11001000100
221312
11
0b
+
+
11
43
+
11000100100
231212
12
0c
,
,
12
44
,
10110011100
112232
13
0d
-
-
13
45
-
10011011100
122132
14
0e
.
.
14
46
.
10011001110
122231
15
0f
/
/
15
47
/
10111001100
113222
16
10
0
0
16
48
0
10011101100
123122
17
11
1
1
17
49
1
10011100110
123221
18
12
2
2
18
50
2
11001110010
223211
19
13
3
3
19
51
3
11001011100
221132
20
14
4
4
20
52
4
11001001110
221231
21
15
5
5
21
53
5
11011100100
213212
22
16
6
6
22
54
6
11001110100
223112
23
17
7
7
23
55
7
11101101110
312131
24
18
8
8
24
56
8
11101001100
311222
25
19
9
9
25
57
9
11100101100
321122
26
1a
:
:
26
58
:
11100100110
321221
27
1b
;
;
27
59
;
11101100100
312212
28
1c
<
<
28
60
<
11100110100
322112
29
1d
=
=
29
61
=
11100110010
322211
30
1e
>
>
30
62
>
11011011000
212123
31
1f
?
?
31
63
?
11011000110
212321
32
20
@
@
32
64
@
11000110110
232121
33
21
A
A
33
65
A
10100011000
111323
34
22
B
B
34
66
B
10001011000
131123
35
23
C
C
35
67
C
10001000110
131321
36
24
D
D
36
68
D
10110001000
112313
37
25
E
E
37
69
E
10001101000
132113
38
26
F
F
38
70
F
10001100010
132311
39
27
G
G
39
71
G
11010001000
211313
40
28
H
H
40
72
H
11000101000
231113
41
29
I
I
41
73
I
11000100010
231311
42
2a
J
J
42
74
J
10110111000
112133
43
2b
K
K
43
75
K
10110001110
112331
44
2c
L
L
44
76
L
10001101110
132131
45
2d
M
M
45
77
M
10111011000
113123
46
2e
N
N
46
78
N
10111000110
113321
47
2f
O
O
47
79
O
10001110110
133121
48
30
P
P
48
80
P
11101110110
313121
49
31
Q
Q
49
81
Q
11010001110
211331
50
32
R
R
50
82
R
11000101110
231131
51
33
S
S
51
83
S
11011101000
213113
52
34
T
T
52
84
T
11011100010
213311
53
35
U
U
53
85
U
11011101110
213131
54
36
V
V
54
86
V
11101011000
311123
55
37
W
W
55
87
W
11101000110
311321
56
38
X
X
56
88
X
11100010110
331121
57
39
Y
Y
57
89
Y
11101101000
312113
58
3a
Z
Z
58
90
Z
11101100010
312311
59
3b
[
[
59
91
[
11100011010
332111
60
3c
\
\
60
92
\
11101111010
314111
61
3d
]
]
61
93
]
11001000010
221411
62
3e
^
^
62
94
^
11110001010
431111
63
3f
_
_
63
95
_
10100110000
111224
64
40
NUL
`
64
96
`
10100001100
111422
65
41
SOH
a
65
97
a
10010110000
121124
66
42
STX
b
66
98
b
10010000110
121421
67
43
ETX
c
67
99
c
10000101100
141122
68
44
EOT
d
68
100
d
10000100110
141221
69
45
ENQ
e
69
101
e
10110010000
112214
70
46
ACK
f
70
102
f
10110000100
112412
71
47
BEL
g
71
103
g
10011010000
122114
72
48
BS
h
72
104
h
10011000010
122411
73
49
HT
i
73
105
i
10000110100
142112
74
4a
LF
j
74
106
j
10000110010
142211
75
4b
VT
k
75
107
k
11000010010
241211
76
4c
FF
l
76
108
l
11001010000
221114
77
4d
CR
m
77
109
m
11110111010
413111
78
4e
SO
n
78
110
n
11000010100
241112
79
4f
SI
o
79
111
o
10001111010
134111
80
50
DLE
p
80
112
p
10100111100
111242
81
51
DC1
q
81
113
q
10010111100
121142
82
52
DC2
r
82
114
r
10010011110
121241
83
53
DC3
s
83
115
s
10111100100
114212
84
54
DC4
t
84
116
t
10011110100
124112
85
55
NAK
u
85
117
u
10011110010
124211
86
56
SYN
v
86
118
v
11110100100
411212
87
57
ETB
w
87
119
w
11110010100
421112
88
58
CAN
x
88
120
x
11110010010
421211
89
59
EM
y
89
121
y
11011011110
212141
90
5a
SUB
z
90
122
z
11011110110
214121
91
5b
ESC
{
91
123
{
11110110110
412121
92
5c
FS
|
92
124
|
10101111000
111143
93
5d
GS
}
93
125
}
10100011110
111341
94
5e
RS
~
94
126
~
10001011110
131141
95
5f
US
DEL
95
195 / 200 / 240
à / È / ð
10111101000
114113
96
60
FNC 3
FNC 3
96
196 / 201 / 241
Ä / É / ñ
10111100010
114311
97
61
FNC 2
FNC 2
97
197 / 202 / 242
Å / Ê / ò
11110101000
411113
98
62
Shift B
Shift A
98
198 / 203 / 243
Æ / Ë / ó
11110100010
411311
99
63
Code C
Code C
99
199 / 204 / 244
Ç / Ì / ô
10111011110
113141
100
64
Code B
FNC 4
Code B
200 / 205 / 245
È / Í / õ
10111101110
114131
101
65
FNC 4
Code A
Code A
201 / 206 / 246
É / Î / ö
11101011110
311141
102
66
FNC 1
FNC 1
FNC 1
202 / 207 / 247
Ê / Ï / ÷
11110101110
411131
103
67
Start Code A
203 / 208 / 248
Ë / Ð / ø
11010000100
211412
104
68
Start Code B
204 / 209 / 249
Ì / Ñ / ù
11010010000
211214
105
69
Start Code C
205 / 210 / 250
Í / Ò / ú
11010011100
211232
106
6a
Stop
—
—
11000111010
233111
—
—
Reverse Stop
—
—
11010111000
211133
—
—
Stop pattern (7 bars/spaces)
206 / 211 / 251
Î / Ó / û
1100011101011
2331112
바코드를 출력하는 것은
바코드 폰트를 이용해서 출력하거나 그래픽 라이브러리를 이용하여 직접 패턴을 그리거나 하면 될 것 같은데요.
바코드 폰트에 따라 코드 값에 차이가 있어 제대로 표현되지 못하는 문제가 생길 가능성도 있지 않을까 싶어 보이네요.
바코드 폰트를 변경해 보면서 Test해 볼 필요도 있지 않을까 싶어 보이고요.
그래픽 라이브러리를 이용해서 패턴을 직접 그려서 표현해 보는 것도 방법이 될 수 있지 않을까 싶기도 하고요.
바코드를 읽는 것은 일반적으로 바코드 리더기를 통해서 읽기 때문에 바코드 리더기가 복호화하여 전달해 주는 데이터를 바로 처리하면 되는 것이라...
OS와의 관련성은 낮아 보이네요.
바코드를 출력할때 또한... OS 영향 보다는 폰트 종류의 영향을 받게 되지 않을까 싶어 보이고요.
댓글 남기기
답변을 작성 하시려면 로그인이 필요합니다.
로그인 회원가입ASCII 코드 범위가 0~127 이니 127보다 큰 경우 -96을 해주면 되지 않을까요?
if (intMMM > 127)
{
intMMM -= 96;
}
안녕하세요. 체크섬이 단순히 아스키코드내에만 들어가면 되는게 아니라서요.. 그런 단순한 문제였으면 저도 좋겠네요 ㅠㅠ
댓글 남기기
답변을 작성 하시려면 로그인이 필요합니다.
로그인 회원가입체크섬 계산에 있어서 32를 더하는게 잘못된게 아닐까 싶네요.
아마도 ASCII 문자로 표현하기 위해 32를 더한게 아닐까 싶어 보이는데...
체크섬 값은 32를 더하지 말고 intSUM % intMOD 로 계산한 값 그대로 코드화 시키면 될 걸로 보입니다.
체크 섬 문자가 무엇인지 화면(콘솔)에 표시해 볼때는 32를 더한 strSUM을 사용하고,
code 128 체크섬 바코드에 넣는 값은 intSUM을 103으로 나눈 나머지 값인 intMMM을 그대로 사용하면 해결될 문제가 아닐까 싶네요.
체크섬이 유효성 검사라고 보시면 됩니다. 바코드에 표기된 문자들이 정말 사용자가 지정한 올바른 문자들인지 전체 비트에 대한 보수합?? 값을 가지고 있어서 리딩시 이 체크섬과 전제 문자열을 비교합니다. 단순히 아스키코드내에만 값이 들어오는 문제가 아니라서요.
댓글 남기기
답변을 작성 하시려면 로그인이 필요합니다.
로그인 회원가입C# 코드에서 intSUM을 계산한 후, 결과에서 보듯이 intSUM이 103보다 큰 경우 intMMM은 ASCII 범위(32~127)을 벗어납니다.
이를 처리하려면 ASCII 범위에 들어갈 때까지 intMMM을 감소시키면 될 것 같은데, 아래 코드 참고해서 확인해보세요.
int intMMM = intSUM % intMOD;
while (intMMM+32 > 127) {
intMMM -= intMOD;
}
string strSUM = ((char)(intMMM+32)).ToString();
Console.WriteLine(string.Format("CHECK SUM : {0}%{1}={2} --> [{3}]", intSum.ToString(), intMOD.ToString(), intMMM.ToString(), strSUM));
이렇게 하면 intMMM이 유효한 범위에 들어갈 때까지 감소하여 ASCII 범위 내에 유지 됩니다.
결과적으로 Code128B 바코드에 대한 유요한 체크섬 값을 얻지 않을까요? ^^
답변 감사합니다. 유효성 체크섬이 단순히 아스키 코드 범위안에만 들어가면 되는게 아니고 전체 비트에 대한 유효성 체크이기때문에 올바른 결과값이 나와야 합니다. ㅠㅠ
그렇다면,
while (intMMM+32 > 127 || intMMM < 0) {
intMMM = (intMMM + intMOD) % intMOD;
}
이렇게 수정하고 Code 128B의 유효 범위 내 있는지 확인해보세요. ^^
댓글 남기기
답변을 작성 하시려면 로그인이 필요합니다.
로그인 회원가입