128条码符号由以下部分组成:
1)左侧空白区
2)起始字符
3)表示数据和特殊字符的一个或多个符号字符
4)符号校验字符
5)终止字符
6)右侧空白区
在条码中每个字符都是由11个模块组成,其中条(黑色)的模块数的和是偶数,空(白色)的模块数的和是奇数。该奇偶特性保证字符的自动校验功能。128码有3个独立的数据字符集:字符集A,字符集B,字符集C。查看一个128采用的是那个字符集,可以通过该条码的起始字符而得知。如果起始字符以START A开始,则可以确定该条码采用的是字符集A,如果以START B开始,则可以确定该条码采用的是字符集B,否则是字符集C。不同的字符集包括的内容是不同的。
字符集A包括所有的大写字母、数字字符、标点字符、控制字符(ASCII值为00到95的字符)以及7个特殊字符;
字符集B包括所有的大写字母、数字字符、标点符号、小写字母字符(ASCII值为32到127的字符)以及7个特殊字符。
字符集C包括100个数据(00--99)以及3个特殊字符。选用字符集C是,用一个符号字符表示两位数字。
对于特殊字符,在ASCII中没有对应的值。但是他们对条码识读设备有特定的意义。对于字符集C,因为一个符号字符表示两位数字,所以只能打印出数字条码,并且只能是偶数位。对于字符集B包括的内容是128码中最全的,所以在实际的应用中128B是最常用的。
对于条码打印,如果是通过专门的条码打印机(zebra,Intermec....)都会有自己的打印机语言(zebra:ZPL,Intermec:FP,IPL...),可以先用条码软件(BarTender)设计好打印模板,生成模板文件,根据需要替换里面要打印的内容,将打印模板通过一定的方式(COM,网口,LPT口)发送到打印机就可以直接打印出来了。如果是一般的打印机打印,就需要通过画图的方式或者下载字体打印。要通过画图的方式,主要的一个难点是要知道对应字符的条(黑)空(白)比。比如大写字母A的黑白分配是:111323即1黑1白1黑3白2黑3白,画图的时候只要将黑色的都画出来就行了。下面给出一段简单的代码:
protected virtual void DrawSingleBar(string bar)
{
if ((bar != null) && (bar.Length != 0))
{
for (int i = 0; i < bar.Length; i += 2)//每次增加2,获得黑色码块
{
char ch = bar[i];
int width = int.Parse(ch.ToString()) * this.LineWidth;//LineWidth每个块的宽度,默认是2
this.g.FillRectangle(this.BarBrush, this.Left, this.Top, width, this.BarHeight);
this.Left += width;
if ((i + 1) < bar.Length)//计算白块的宽度
{
ch = bar[i + 1];
this.Left += int.Parse(ch.ToString()) * this.LineWidth;
}
}
}
}
对于默认的每个块的宽度,最小的是2,最大的是7,具体的算法可查找128码的编码规则。