SharedIT | 묻고 답하기(AMP)

바코드 Code 128 변환 질문드립니다.

안녕하세요. 

공정에서 사용할 바코드 프로그램을 만들어 생성하고 있는데 특정 문자열이 리딩이 되지 않는 현상이

있어 문의드립니다. 

바코드를 리딩되게 하려면 문자열을 변환해야 하는데 Code 128 B 의 체크섬 결과값이 아스키코드를 벗

어나 체크섬 값을 얻지 못해 리딩이 되지 않는 현상이 발생하네요.

체크섬 계산에 아스키코드를 벗어나는 값이 산출되면 한번더 계산을 해야하는데  그 감가식을 모

르겠네요. 혹시 이걸 해결하는 방법을 아시는 분이 계실까요??

아래코드는 체크섬을 산출하는 코드입니다.

 (content 길이가 길다며 텍스트를 추가할 수 없어 이미지로 대체합니다.)



Tags : 태그가 없습니다.

7개의 답변이 있습니다.

wansoo
  0 추천 | 3달 전

이 질문이 다시 생각나서...

파이썬으로 직접 코딩 한번 해 보았네요.


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

넣어서 바코드를 만들었고요.



바코드는 아래와 같이 생성되게 되고요.





바코드 리더기에서도 잘 읽어 집니다.




wansoo | 3달 전

코드 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()

======================


hgp33 | 3달 전

안녕하세요. CNYTAI0008 변환해보시겠어요?? 저도 다 잘 변환이 되는데 문자열에 따라 변환이 되었다 안되었다 합니다.

wansoo | 3달 전

바코드가 아래와 같이 나옵니다.

체크섬 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 ));

}

=========================

hgp33 | 3달 전

여러번 테스트 해봤지만 혹시나 하는 기대에 wansoo님께서 알려주신 로직과 폰트를 적용을 해봤습니다. 문제가 되었던 문자열은 올바르게 나오지만 다른 문자들이 바코드가 깨지네요 ㅠㅠ




wansoo | 3달 전

폰트를 아래 링크에서 다운 받은걸로 해 보셨나요?

현재 사용중인 code 128 폰트를 제거하고, 


https://fontmeme.com/ktype/code-128-font/   에서 폰트를 다운 받아서 설치해서 사용해 보세요.

wansoo | 3달 전

아니면 지금 사용중인 폰트를 보내 주시면, 로직을 찾아 봐 드릴 수도 있을 것 같습니다.

wansoo | 3달 전

CNYTAI0006  체크섬 : 80





CNYTAI0005  체크섬 : 70



CNYTAI0006 와 CNYTAI0005은 체크섬이 80과 70으로 94 이하의 값인데도 체크섬에 대한 바코드가 제대로 표시되지 않는다면...

바코드 폰트에 문제일 가능성 보다는...

체크섬을 바코드로 변환할때까지의 과정중에 잘못된 처리로 하고 있을 가능성이 높아보입니다.


코드 전체를 알려 주시면 문제점을 찾아 봐 드릴 수도 있을 것 같습니다.

wansoo | 3달 전

체크섬이 70이면, 체크섬 부분에 f, 체크섬이 80이면 체크섬 부분에 p가 들어 가야 합니다.

hgp33 | 3달 전

아 다시 확인해보니 이리저리 해보니라 주석처리를 한게 있었네요 ㅎㅎ;; 조건절에 체크섬 결과값에서 비교하는 값에 32를 더해서 구해버렸네요 ㅎㅎ 다시 해보니 정상적으로 나옵니다. 해당폰트는 따로 저장을 해두었습니다. 감사합니다~!! 

wansoo | 3달 전

수고하셨습니다~ ^^

명동쓰레빠
  0 추천 | 3달 전

덕분에 자료 잘 보았습니다.


wansoo
  0 추천 | 4달 전

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)

wansoo
  0 추천 | 4달 전

체크섬이란 개념과 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 코드로 변환해서 화면에 표시해  필요는 없을 거라 생각되네요.


hgp33 | 4달 전

안녕하세요. 말씀하신 체크섬은 리딩시 문자로 표기되지 않지만 바코드에는 바 형태로 표기가 됩니다. 해당 체크섬의 결과를 문자로 변환하여 바형태로 표기가 되고 문자의 코드표를 기준으로 체크섬을 가져와 전체 문자열과 비교를 합니다. 바 구성은 [startCode][Text][checksum][endCode] 설명대로 startCode는 A,B,C에 따라 고정값이 쓰여지고 endCode는 동일 고정값입니다. 지금 문제는 checksum 값이 아스키코드 값을 벗어나서 인지 checksum에 표기되어야할 바가 누락되는 현상입니다. 

wansoo | 4달 전

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)

hgp33 | 3달 전

안녕하세요. 답변을 드린다는게 이걸해결하니라 이제야 답변을 남기네요. 혹시나 추후에 이 게실글을 참고하시는 분이 계실까해서 추가 답변을 남기네요. 해당 코드표를 보고 요리저리 재계산을 굴려봤지만 체크섬 결과가 바 형태로 표기가 안되거나 억지로 아스키 코드 값에 들어오도록 해봤지만 체크섬 결과가 전체 문자열에 대한 계산과 맞지 않아 리딩이 되질 않습니다. 여튼 체크섬 계산식에 의해 결과가 코드표 좌측의 code 128 value가 95 이상이 나오면 이는 아스키 코드 126을 벗어나 바코드 폰트에서 이를 표현할 수가 없거나 표현이 된다해도 운영체제에 따라 인식을 못합니다. (stackoverflow를 참고하면 바코드 폰트의 인코딩 형식에 따라 표현이 되거나 안될 수도 있고 운영체제의 캐릭터셋도 영향을 끼침 ) 또한 이건 제 개인적인 생각이지만 코드표의 code 128 value 값 95 ~ 106은 예약어로 추정되어 체크섬 값으로 사용을 할 수가 없는 것 같습니다. 질문글의 결과가 code 128 value 값 100인데 이는 Code 128 B 에서 FNC4 입니다. 따라서 바코드 폰트를 이용하여 바코드를 표현하실 분들은 체크섬 결과에 따라 바코드의 바가 누락되거나 정상적으로 표현이 되지 않는 경우가 있으며 가급적 code 39를 이용하시는게 좋을 듯 하며 난 대소문자가 꼭 필요하다 하시는 분들은 바코드 폰트를 이용하지 마시고 바코드 라이브러리를 추가해서 변환하여 이용하시는게 여러모로 수월합니다. wansoo님 자료가 많은 참조가 되었네요 감사합니다~!

wansoo | 3달 전

아래 위키피디아 자료를 참고해 보면 도움이 될 것 같아 보이네요.

Code 128 - Wikipedia

Code 128

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




wansoo | 3달 전

바코드를 출력하는 것은

바코드 폰트를 이용해서 출력하거나 그래픽 라이브러리를 이용하여 직접 패턴을 그리거나 하면 될 것 같은데요.

바코드 폰트에 따라 코드 값에 차이가 있어 제대로 표현되지 못하는 문제가 생길 가능성도 있지 않을까 싶어 보이네요.

바코드 폰트를 변경해 보면서 Test해 볼 필요도 있지 않을까 싶어 보이고요.

그래픽 라이브러리를 이용해서 패턴을 직접 그려서 표현해 보는 것도 방법이 될 수 있지 않을까 싶기도 하고요.


바코드를 읽는 것은 일반적으로 바코드 리더기를 통해서 읽기 때문에 바코드 리더기가 복호화하여 전달해 주는 데이터를 바로 처리하면 되는 것이라...

OS와의 관련성은 낮아 보이네요.

바코드를 출력할때 또한... OS 영향 보다는 폰트 종류의 영향을 받게 되지 않을까 싶어 보이고요.

topkslee
  0 추천 | 4달 전

ASCII 코드 범위가 0~127 이니 127보다 큰 경우 -96을 해주면 되지 않을까요?

if (intMMM > 127)

{

intMMM -= 96;

}

hgp33 | 4달 전

안녕하세요. 체크섬이 단순히 아스키코드내에만 들어가면 되는게 아니라서요.. 그런 단순한 문제였으면 저도 좋겠네요 ㅠㅠ

wansoo
  0 추천 | 4달 전

체크섬 계산에 있어서 32를 더하는게 잘못된게 아닐까 싶네요.

아마도 ASCII 문자로 표현하기 위해 32를 더한게 아닐까 싶어 보이는데...

체크섬 값은 32를 더하지 말고 intSUM % intMOD 로 계산한 값 그대로 코드화 시키면 될 걸로 보입니다.


wansoo | 4달 전

체크 섬 문자가 무엇인지 화면(콘솔)에 표시해 볼때는 32를 더한 strSUM을 사용하고,

code 128 체크섬 바코드에 넣는 값은 intSUM을 103으로 나눈 나머지 값인 intMMM을 그대로 사용하면 해결될 문제가 아닐까 싶네요.

hgp33 | 4달 전

체크섬이 유효성 검사라고 보시면 됩니다. 바코드에 표기된 문자들이 정말 사용자가 지정한 올바른 문자들인지 전체 비트에 대한 보수합?? 값을 가지고 있어서 리딩시 이 체크섬과 전제 문자열을 비교합니다. 단순히 아스키코드내에만 값이 들어오는 문제가 아니라서요. 

앵그리파파
  0 추천 | 4달 전

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 바코드에 대한 유요한 체크섬 값을 얻지 않을까요? ^^

hgp33 | 4달 전

답변 감사합니다. 유효성 체크섬이 단순히 아스키 코드 범위안에만 들어가면 되는게 아니고 전체 비트에 대한 유효성 체크이기때문에 올바른 결과값이 나와야 합니다. ㅠㅠ 

앵그리파파 | 4달 전

그렇다면, 

while (intMMM+32 > 127 || intMMM < 0) {

intMMM = (intMMM + intMOD) % intMOD;

}

이렇게 수정하고 Code 128B의 유효 범위 내 있는지 확인해보세요. ^^