好久没写Blog了,这次写写条码(code128)打印的实现。条码在工业应用方面很广泛,所以我们在编写程序时,特别是打印报表时,经常用到。

#region "本段为转载"  转自:http://kaliking.blog.51cto.com/58641/33734

先简述一下CODE128的原理吧,分别以一个unicode字符作为起始符(Ì)和终止符(Î),

然后需要根据你的字符串, 计算出当前字符集的校验码:

ode 128 Barcode Table

Value

Code Set A

Code Set B

Code Set C

Bar/Space Pattern B S B S B S

0

SP

SP

00

2 1 2 2 2 2

1

!

!

01

2 2 2 1 2 2

2

"

"

02

2 2 2 2 2 1

3

#

#

03

1 2 1 2 2 3

4

$

$

04

1 2 1 3 2 2

5

%

%

05

1 3 1 2 2 2

6

&

&

06

1 2 2 2 1 3

7

'

'

07

1 2 2 3 1 2

8

(

(

08

1 3 2 2 1 2

9

)

)

09

2 2 1 2 1 3

10

*

*

10

2 2 1 3 1 2

11

+

+

11

2 3 1 2 1 2

12

,

,

12

1 1 2 2 3 2

13

-

-

13

1 2 2 1 3 2

14

.

.

14

1 2 2 2 3 1

15

/

/

15

1 1 3 2 2 2

16

0

0

16

1 2 3 1 2 2

17

1

1

17

1 2 3 2 2 1

18

2

2

18

2 2 3 2 1 1

19

3

3

19

2 2 1 1 3 2

20

4

4

20

2 2 1 2 3 1

21

5

5

21

2 1 3 2 1 2

22

6

6

22

2 2 3 1 1 2

23

7

7

23

3 1 2 1 3 1

24

8

8

24

3 1 1 2 2 2

25

9

9

25

3 2 1 1 2 2

26

:

:

26

3 2 1 2 2 1

27

;

;

27

3 1 2 2 1 2

28

<

<

28

3 2 2 1 1 2

29

=

=

29

3 2 2 2 1 1

30

>

>

30

2 1 2 1 2 3

31

?

?

31

2 1 2 3 2 1

32

@

@

32

2 3 2 1 2 1

33

A

A

33

1 1 1 3 2 3

34

B

B

34

1 3 1 1 2 3

35

C

C

35

1 3 1 3 2 1

36

D

D

36

1 1 2 3 1 3

37

E

E

37

1 3 2 1 1 3

38

F

F

38

1 3 2 3 1 1

39

G

G

39

2 1 1 3 1 3

40

H

H

40

2 3 1 1 1 3

41

I

I

41

2 3 1 3 1 1

42

J

J

42

1 1 2 1 3 3

43

K

K

43

1 1 2 3 3 1

44

L

L

44

1 3 2 1 3 1

45

M

M

45

1 1 3 1 2 3

46

N

N

46

1 1 3 3 2 1

47

O

O

47

1 3 3 1 2 1

48

P

P

48

3 1 3 1 2 1

49

Q

Q

49

2 1 1 3 3 1

50

R

R

50

2 3 1 1 3 1

51

S

S

51

2 1 3 1 1 3

52

T

T

52

2 1 3 3 1 1

53

U

U

53

2 1 3 1 3 1

54

V

V

54

3 1 1 1 2 3

55

W

W

55

3 1 1 3 2 1

56

X

X

56

3 3 1 1 2 1

57

Y

Y

57

3 1 2 1 1 3

58

Z

Z

58

3 1 2 3 1 1

59

[

[

59

3 3 2 1 1 1

60

/

/

60

3 1 4 1 1 1

61

]

]

61

2 2 1 4 1 1

62

^

^

62

4 3 1 1 1 1

63

_

_

63

1 1 1 2 2 4

64

NUL

`

64

1 1 1 4 2 2

65

SOH

a

65

1 2 1 1 2 4

66

STX

b

66

1 2 1 4 2 1

67

ETX

c

67

1 4 1 1 2 2

68

EOT

d

68

1 4 1 2 2 1

69

ENQ

e

69

1 1 2 2 1 4

70

ACK

f

70

1 1 2 4 1 2

71

BEL

g

71

1 2 2 1 1 4

72

BS

h

72

1 2 2 4 1 1

73

HT

i

73

1 4 2 1 1 2

74

LF

j

74

1 4 2 2 1 1

75

VT

k

75

2 4 1 2 1 1

76

FF

I

76

2 2 1 1 1 4

77

CR

m

77

4 1 3 1 1 1

78

SO

n

78

2 4 1 1 1 2

79

SI

o

79

1 3 4 1 1 1

80

DLE

p

80

1 1 1 2 4 2

81

DC1

q

81

1 2 1 1 4 2

82

DC2

r

82

1 2 1 2 4 1

83

DC3

s

83

1 1 4 2 1 2

84

DC4

t

84

1 2 4 1 1 2

85

NAK

u

85

1 2 4 2 1 1

86

SYN

v

86

4 1 1 2 1 2

87

ETB

w

87

4 2 1 1 1 2

88

CAN

x

88

4 2 1 2 1 1

89

EM

y

89

2 1 2 1 4 1

90

SUB

z

90

2 1 4 1 2 1

91

ESC

{

91

4 1 2 1 2 1

92

FS

|

92

1 1 1 1 4 3

93

GS

}

93

1 1 1 3 4 1

94

RS

~

94

1 3 1 1 4 1

95

US

DEL

95

1 1 4 1 1 3

96

FNC 3

FNC 3

96

1 1 4 3 1 1

97

FNC 2

FNC 2

97

4 1 1 1 1 3

98

SHIFT

SHIFT

98

4 1 1 3 1 1

99

CODE C

CODE C

99

1 1 3 1 4 1

100

CODE B

FNC 4

CODE B

1 1 4 1 3 1

101

FNC 4

CODE A

CODE A

3 1 1 1 4 1

102

FNC 1

FNC 1

FNC 1

4 1 1 1 3 1

103

Start A

Start A

Start A

2 1 1 4 1 2

104

Start B

Start B

Start B

2 1 1 2 1 4

105

Start C

Start C

Start C

2 1 1 2 3 2

106

Stop

Stop

Stop

2 3 3 1 1 1 2

Example... To calculate the check digit for the barcode data string 'Code 128'

                              Value                  Total
=====                  =====
Start Code B      104                    104
Position 1              C       35         1 x 35 =    35
Position 2              o       79         2 x 79 =   158
Position 3              d       68         3 x 68 =   204
Position 4              e       69         4 x 69 =   276
Position 5                       0         5 x  0 =     0
Position 6              1       17         6 x 17 =   102
Position 7              2       18         7 x 18 =   126
Position 8              8       24         8 x 24 =   192
=====
1197
=====
1197/103 = 11 remainder 64
根据上表, 把没个字符的value值 乘上 字符在字符串中的位置(从1开始算)
把没个乘积加起来
因为CODESET B 为104(这是规定, 不要问我为什么)
所以, 还要加上 104
最后, 除以103, 所得的余数就是 校验码 的value值, 然后在表中找到对应的字符
就可以了.
有心人应该注意到了, value>=95的时候, 是没有字符的(事实上还是有的,
只不过是unicode字符)
好了, 原理就阐述到这里, 还有什么不懂的话, 大家看看代码好了.
至于用在水晶报表上的问题, 我这里是配合条码字体的, 我会上传一个我正在用的字体.
代码如下:
Public Function StringToCode128(ByVal input As String) As String
Try
Dim endchar As Char
Dim total As Int64 = 104
Dim tmp As Integer
For i As Int16 = 1 To input.Length
tmp = Asc(input.Substring(i - 1, 1))
If tmp >= 32 Then
total += (tmp - 32) * i
Else
total += (tmp + 64) * i
End If
Next
Dim endAsc = total Mod 103
If endAsc >= 95 Then
Select Case endAsc
Case 95
endchar = "Ã"
Case 96
endchar = "Ä"
Case 97
endchar = "Å"
Case 98
endchar = "Æ"
Case 99
endchar = "Ç"
Case 100
endchar = "È"
Case 101
endchar = "É"
Case 102
endchar = "Ê"
End Select
Else
endAsc += 32
endchar = Chr(endAsc)
End If
Return "Ì" & input & endchar.ToString() & "Î"
Catch ex As Exception
WriteLog(ex.Message, ex.StackTrace)
Return String.Empty
Finally
End Try
End Function
我放大一下上面用到的特殊字符,大家看看清楚:
起始符:Ì
终止符:Î
value95:Ã
value96:Ä
value97:Å
value98:Æ
value99:Ç
value100:È
value101:É
value102:Ê
#endregion
根据以上代码,这作了几个转换的版本,用于不同的环境,
C#版本:
private string  StringToCode128(string input)
{try
{char endChar=(char)0;
Int64 total = 104;
int tmp;
Int64 endAsc;
for (int i = 0; i < input.Length; i++)
{tmp = (int)(Convert.ToChar(input.Substring(i, 1)));
if (tmp >= 32)
{total += (tmp - 32) * (i + 1);
}
else
{total += (tmp + 64) * (i + 1);
}
}
endAsc = total % 103;
if (endAsc >= 95)
{switch (endAsc)
{case 95:
endChar = 'Ã';
break;
case 96:
endChar = 'Ä';
break;
case 97:
endChar = 'Å';
break;
case 98:
endChar = 'Æ';
break;
case 99:
endChar = 'Ç';
break;
case 100:
endChar = 'È';
break;
case 101:
endChar = 'É';
break;
case 102:
endChar = 'Ê';
break;
}
}
else
{endAsc += 32;
endChar = (char)endAsc;
}
return "Ì" + input + endChar.ToString() + "Î";
}
catch (Exception ex)
{MessageBox.Show("Error");
return string.Empty;
}
}
Office 中Excel版本:
Public Function Code128b(DataToEncode As String) As String
Dim endchar As string
Dim total As Integer
total = 104
Dim tmp As Integer
dim i as integer
dim Ito as integer
Ito = Len(dataToEncode)
dim tempstring as string
dim j as integer
For i = 1 To Ito
tempstring = Mid(DataToEncode, i, 1)
tmp = AscW(tempstring)
If tmp >= 32 Then
total =total+ (tmp - 32) * i
Else
total =total+ (tmp + 64) * i
End If
Next
dim endasc as integer
endAsc = total Mod 103
If endAsc >= 95 Then
Select Case endAsc
Case 95
endchar = ChrW(195)
Case 96
endchar = ChrW(196)
Case 97
endchar = ChrW(197)
Case 98
endchar = ChrW(198)
Case 99
endchar = ChrW(199)
Case 100
endchar = ChrW(200)
Case 101
endchar = ChrW(201)
Case 102
endchar = ChrW(202)
End Select
Else
endAsc =endasc + 32
endchar = ChrW(endAsc)
End If
Code128a=ChrW(204) + DataToEncode + endchar + ChrW(206)
end function
OpenOffice版本(注:此版本只能在支持VBA的OxygenOffice中应用):
Public Function Code128a(DataToEncode As String) As String
Dim endchar As string
Dim total As Integer
total = 104
Dim tmp As Integer
dim i as integer
dim Ito as integer
Ito = Len(DataToEncode)
dim tempstring as string
dim j as integer
For i = 1 To Ito
tempstring = Mid(DataToEncode, i, 1)
tmp = AscW(tempstring)
If tmp >= 32 Then
total =total+ (tmp - 32) * i
Else
total =total+ (tmp + 64) * i
End If
Next
dim endasc as integer
endAsc = total Mod 103
If endAsc >= 95 Then
Select Case endAsc
Case 95
endchar = "Ã"
Case 96
endchar = "Ä"
Case 97
endchar = "Å"
Case 98
endchar = "Æ"
Case 99
endchar = "Ç"
Case 100
endchar = "È"
Case 101
endchar = "É"
Case 102
endchar = "Ê"
End Select
Else
endAsc =endasc + 32
endchar = ChrW(endAsc)
End If
Code128a= "Ì" + DataToEncode + endchar + "Î"
end function

条码(code128)的不同版本实现相关推荐

  1. socket用起始码分割_常用条码Code128码及EAN13码的介绍

    在条码打印软件中,设计条码标签时经常用到的码制是Code128码和EAN13码.因为这两种码制比较贴近我们的生活.比如:我们去超市购物,商品上贴的条码标签都是EAN13码,因为EAN13码多用于零售产 ...

  2. 字符串生成条码(CODE128),并实现在水晶报表上的条码打印!

    最近的项目有一个条码打印的要求, 鉴于很多条码软件/库 都是收费的, 一直在找免费的. 在Google上搜了很久, 资料是不少, 但不是免费的 就是 没有源码的. 于是, 决定自己写代码解决. 继续G ...

  3. C# vb .NET读取识别条形码线性条码code128

    code128是比较常见的条形码编码规则类型的一种.如何在C#,vb等.NET平台语言里实现快速准确读取该类型条形码呢?答案是使用SharpBarcode! SharpBarcode是C#快速高效.准 ...

  4. ZXing 生成二维码 QRCode 和条码 CODE128 和 ZXing 解析或读取 QR_Code 和 条码 CODE_128

    二维码是国际标准,由日本某公司发明,并保留版权,免费让全世界使用,目前在中国金融支付领域大放异彩. 条码的联合发明人诺曼·约瑟夫·伍德兰德(Norman Joseph Woodland)于上世纪70年 ...

  5. 常见条码及其相关概念简介

    常见条码及其相关概念简介 一.名词解释 条码 条码是由一组规则排列的条.空及其对应字符组成的标记,用以表示一定的信息.如:  代码 代码即一组用来表征客观事物的一个或一组有序的符号.上图中:69012 ...

  6. JAVA 佳博热敏打印机利用TSCLIB.dll动态链接库打印物料条码

    JAVA 佳博热敏打印机利用TSCLIB.dll动态链接库打印物料条码 准备 1.TSCLIB.dll (下载版本与jdk版本一致,32位/64位) 2.佳博热敏打印机一台(或其他tsc系列打印机) ...

  7. TSC TTP-244 Pro打印机QT版本开发

    承接开发:QQ786453398 TSC TTP-244 Pro打印机QT版本开发 一.硬件安装 1.根据官方使用手册和视频正确完成打印机的安装,如果缺乏驱动可以到官网下载.驱动链接:https:// ...

  8. pystrich生成code128、ean13、qrcode二维码

    import os import time import sys from pystrich.code128 import Code128Encoder from pystrich.ean13 imp ...

  9. 金蝶KIS专业版实现'条码标签打印'功能对物料多个条码打印

    金蝶KIS专业版实现'条码标签打印'功能对物料多个条码进行条码打印,减少条码打印工作量: 支持普通打印机A4页面打印或立象条码打印机.SATO CX400.Zebra斑马打印机等条码打印机: 1.条码 ...

最新文章

  1. java 宽字节_宽字节注入
  2. ssh框架实现数据库_自顶向下介绍SSH及其如何实现安全的数据共享
  3. Spring MVC集成Spring Data Reids和Spring Session实现Session共享
  4. eclipse egit提交方法
  5. 家庭NAS搭建实战之samba共享
  6. 软件层面可以做到重启本地串口吗_手机关机还是重启好?get这几招,手机更流畅...
  7. php 字符串 中文,php 中文字符串截取乱码
  8. EF性能优化-有人说EF性能低,我想说:EF确实不如ADO.NET
  9. 如何用15天摸清一个新的行业?
  10. qt tabwidget 设置tab 位置_qml创建TabWidget的案例
  11. python librosa库实现变声
  12. 2017电子设计大赛论文:滚球控制系统
  13. 亚马逊AWS图形界面登陆
  14. 同一个接口返回多种数据类型
  15. 网页加速之Link prefetching
  16. 带宽叠加是什么意思?
  17. SSM 运行报错Failed to load resource: the server responded with a status of 404 (Not Found)
  18. openssl编程-DH
  19. JavaScript的原型和继承
  20. 差分进化算法python 指派问题_多目标优化算法

热门文章

  1. 解决TXT记事本乱码问题
  2. 苹果cmsv10首涂第二十五套精简宽屏大气带后台简约模板
  3. 项目管理计算-- PV、EV、AC、BAC、EAC、ETC等计算公式含义
  4. 记得每天锻炼身体c语言程序,c语言程序
  5. 文献阅读-融合注意力机制的 IETM 细粒度跨模态检索算法
  6. Android实现自定义字体格式液晶数字
  7. Unity使用设置界面Slider控制音量,场景切换时音量滑条都不改变
  8. 相控阵天线(波束扫描)
  9. 永磁无刷电机及其驱动技术_PDF.rar
  10. RV1109 EVB板使用流程