EAN13条码实验.docx
《EAN13条码实验.docx》由会员分享,可在线阅读,更多相关《EAN13条码实验.docx(18页珍藏版)》请在冰豆网上搜索。
EAN13条码实验
实验:
EAN—13条形码
一、实验目的
复习并巩固C语言,熟练的运用C语言进行编程。
通过使用VisualC++程序编译软件编写源程序,能够实现ENA13条形码的生成。
二、实验要求
1、利用C语言编程实现ENA13条形码
2、代码实现的主要功能有:
基本的输入输出功能、条形码的读取、条形码的生成
三、实验原理
1、EAN-13条形码的字符格式
国际物品条形码有两个版本,一个是标准版,另一个是缩短版。
标准版即我们通常所说的ERIN-13。
标准版规定十三位数字的条形码符号形式,如图1.所示。
开始三位数字(用FI-F3表示)代表商品制造商所属的国家或地区,也称为前缀号。
例如日本为49#,澳大利亚为93#,我国为690。
这里的“#”表示0-9的任意数字。
接下来的四位数字(M1-M4表示)为商品制造商的代码,是由该国编码管理局审查批准并登记注册的。
在接下来的五位数字(I1-I5表示)是由所在国编码管理局注册的生产企业所给的商品编码,由企业自己编制。
最后一位是校验位(C),用来检查条形码阅读器的结果是否正确。
图1.EAN条码的格式
2、EAN-13条形码的构成
通用商品条码从左侧空白区开始,依次向右为左侧空白区、起始符、左侧数据符、中间分隔符、右侧数据符、校验符、终止符,到右侧空白区为止。
左、右侧空白:
没有任何印刷符号的空白区域,它通常是白的,位于条码符号的两侧。
用以提示阅读器准备扫描条形码符号,共有十八个模块组成(其中左侧空白不得少于9个模块宽度),一般左侧11个模块,右侧7个模块。
起始符:
条形码符号的第一位字符是起始符,它特殊的条空结构用于识别条形码符号的开始,由3个模块组成。
左侧数据符:
位于中间分隔符的左侧,表示一定信息的条码字符,由42个模块组成。
中间分隔符:
位于条码中间位置的若干条与空,用于区分左右侧数据,有5个模块构成。
右侧数据符:
位于中间分隔符右侧,表示一定信息的条码字符,由35个模块组成。
条码校验符:
表示校验码的条码字符,用以校验条码符号的正确与否,由7个模块组成。
终止符:
条形码符号的最后一位字符是终止符,它的特殊的条空结构用于识别条形码符号的结束,由3个模块组成。
可见起始符、终止符的编码是相同的,都是用等宽的两个黑线条加一个白线条组成,分别是黑-白-黑。
如规定一个模块宽度的黑条对应1,白条对应0,则起始符和终止符的编码为101,中间分隔符的编码为01010。
这三种符号的条空排列是固定不变的,比其他条空的长度略长。
图2.标准EAN-13条形码的构成
3、EAN-13条形码的编码原则
所谓编码原则就是针对商品项目代码而言的。
我们所研究的一维条码是我国主要采用的EAN代码,编码时应遵循如下原则:
a、唯一性所谓唯一性是指商品项目与其标识代码一一对应,即一个商品项目只有一个代码,一个代码只标识同一商品项目。
商品项目代码一旦确定,永不改变,即使该商品停止生产,停止供应了,在一段时间以内(一些国家规定为3年)也不得将该代码分配给其他商品项目。
在商品系统中商品及商品价格的差异是靠不同的代码识别的。
唯一的商品项目代码与厂商代码和国别(地区)组配在一起就可以保证商品的代码标识在一个国家(地区)乃至全世界范围内都是唯一的。
唯一性是商品编码最重要的一条原则,也是传统条码的局限所在。
b、无含义无含义是指代码数字本身及其位置不表示商品的任何特定信息。
平常说的“流水号”就是一种无含义代码。
在EAN及UPC系统中,商品编码仅仅是一种识别商品的手段,而不是商品分类的手段。
无含义使商品编码具有简单、灵活、可靠、充分利用代码容量大、生命力强等特点,所以传统条码需要借助数据库的存在。
c、全数字型代码在EAN及UPC系统中,商品编码全部采用阿拉伯字母。
4、ENA13条形码的特性
1、只能储存数字。
2、可以双向扫描处理。
3、必须有一检查码,用以防止读取资料的错误情形发生,位于ENA码中的最右边处。
4、具有左护线,中线以及右护线,以分隔条码上的不同部分。
5、条码长度一定,较缺乏弹性,但经由适当的管道,可以使其通用于全世界。
四、实验过程
1、下载一个Easyx解压包并新建一个ENA13文件夹。
2、解压并安装Easyx软件。
3、在VisualC++程序编译软件中建立ENA13工程。
4、编写程序并运行调试到没有错误。
5、编译并运行结果
五、实验总结
通过本次实验,我对EAN—13条码的编码方法和编码原理及规则有了更深层次的了解,而且对EAN13条形码的结构也更加清楚,虽然实验过程并不是很顺利,但最后通过查找资料及询问同学,实验做成功了,该实验不仅让我巩固了大一时所学的C语言知识,能够更加熟练的运用了VisualC++环境中编写程序的基本方法,而且加深了我对条形码的了解,并且对信息自动识别技术的学习有很大帮助。
六、附录:
实验源代码如下:
#include<>
#include<>
#include<>
#include<>
intstartX,startY,height;
//划线,注意这里设置的是一条线的宽度占两个像素
voidDrawLine(inth)
{
setcolor(BLACK);
line(startX,startY,startX,startY+height+h);
line(startX+1,startY,startX+1,startY+height+h);
startX+=2;
}
//左侧空白处理
voidLeftBlank()
{
clearcliprgn();//清空画图
setcolor(BLACK);//设置绘图色为红色
rectangle(startX,startY-10,startX+226,startY+120);//画矩形
startX=startX+9*2;//留出9个模块的空白
}
//起始符处理
voidStartPattern()
{
DrawLine(10);
startX+=2;
DrawLine(10);
}
//左侧数据处理
voidLeftDataPattern(char*leftdata)
{
inti;
for(i=0;i<42;i++)
{
if(leftdata[i]=='1')
DrawLine(0);
else
startX+=2;
}
}
//中间分隔符处理
voidCenterDivisionPattern()
{
inti;
intcenter[5]={0,1,0,1,0};
for(i=0;i<5;i++)
{
if(center[i]==1)
DrawLine(10);
else
startX+=2;
}
}
//右侧数据处理
voidRightDataPattern(char*rightdata)
{
inti;
for(i=0;i<42;i++)
{
if(rightdata[i]=='1')
DrawLine(0);
else
startX+=2;
}
}
//结束符处理
voidEndPattern()
{
DrawLine(10);
startX+=2;
DrawLine(10);
}
//数据检查处理
boolDataCheck(char*strdata)
{
inti;
if(strlen(strdata)!
=12)
{
printf("您输入的数据长度不正确,\n");
returnfalse;
}
for(i=0;i<12;i++)
{
if(strdata[i]<'0'||strdata[i]>'9')
{
printf("您输入的不是数字,\n");
returnfalse;
}
}
returntrue;
}
//输入数据并检查数据的格式
voidinput(int*data)
{
charstrdata[13];
inti;
printf("请输入12位的数据:
\n");
gets(strdata);
while(!
DataCheck(strdata))
{
printf("请重新输入:
\n");
scanf("%s",strdata);
}
for(i=0;i<12;i++)
{
data[i]=strdata[i]-'0';
}
}
//获取校验位
intGetCheckBit(int*data)
{
inti,sum=0,n;
for(i=0;i<12;i++)
{
n=(i+1)%2data[i]:
data[i]*3;
sum+=n;
}
sum%=10;
return(10-sum)%10;
}
char*ASubset(intnumber)
{
char*strdata;
switch(number)
{
case0:
strdata="0001101";
break;
case1:
strdata="0011001";
break;
case2:
strdata="0010011";
break;
case3:
strdata="0111101";
break;
case4:
strdata="0100011";
break;
case5:
strdata="0110001";
break;
case6:
strdata="0101111";
break;
case7:
strdata="0111011";
break;
case8:
strdata="0110111";
break;
case9:
strdata="0001011";
break;
}
returnstrdata;
}
char*BSubset(intnumber)
{
char*strdata;
switch(number)
{
case0:
strdata="0100111";
break;
case1:
strdata="0110011";
break;
case2:
strdata="0011011";
break;
case3:
strdata="0100001";
break;
case4:
strdata="0011101";
break;
case5:
strdata="0111001";
break;
case6:
strdata="0000101";
break;
case7:
strdata="0010001";
break;
case8:
strdata="0001001";
break;
case9:
strdata="0010111";
break;
}
returnstrdata;
}
char*CSubset(intnumber)
{
char*strdata;
switch(number)
{
case0:
strdata="1110010";
break;
case1:
strdata="1100110";
break;
case2:
strdata="1101100";
break;
case3:
strdata="1000010";
break;
case4:
strdata="1011100";
break;
case5:
strdata="1001110";
break;
case6:
strdata="1010000";
break;
case7:
strdata="1000100";
break;
case8:
strdata="1001000";
break;
case9:
strdata="1110100";
break;
}
returnstrdata;
}
char*LeftDataSelectRole(intnumber)
{
char*strdata;
switch(number)
{
case0:
strdata="AAAAAA";
break;
case1:
strdata="AABABB";
break;
case2:
strdata="AABBAB";
break;
case3:
strdata="AABBBA";
break;
case4:
strdata="ABAABB";
break;
case5:
strdata="ABBAAB";
break;
case6:
strdata="ABBBAA";
break;
case7:
strdata="ABABAB";
break;
case8:
strdata="ABABBA";
break;
case9:
strdata="ABBABA";
break;
}
returnstrdata;
}
//获取左侧数据处理
voidGetLeftData(int*data,intbegin,intend,char*leftdata)
{
inti;
char*str;
str=LeftDataSelectRole(data[0]);
for(i=begin;i<=end;i++)
{
if(str[i-1]=='A')
{
strcat(leftdata,ASubset(data[i]));
}
if(str[i-1]=='B')
strcat(leftdata,BSubset(data[i]));
}
}
//获取左侧数据处理
voidGetRightData(int*data,intbegin,intend,char*rightdata)
{
inti;
for(i=begin;i<=end;i++)
{
strcat(rightdata,CSubset(data[i]));
}
}
//获取数据
voidGetData(char*leftdata,char*rightdata)
{
intdata[13]={0};
input(data);//输入数据
data[12]=GetCheckBit(data);//计算校验位
//printf("%d\n",data[12]);//输出校验位的值
GetLeftData(data,1,6,leftdata);//获取左侧数据
GetRightData(data,7,12,rightdata);//获取右侧数据
}
//画EAN13条码的主体函数
voidDrawEAN13()
{
//intleftdata[42]={0,0,0,1,0,1,1,0,1,0,0,1,1,1,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,1,1,1,1,0,1,0,1,0,0,0,1,1};6789
//intrightdata[42]={1,0,0,1,1,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,0,1,1,1,0,1,0,0,1,1,0,1,1,0,0};
charleftdata[43]={0};
charrightdata[43]={0};
GetData(leftdata,rightdata);//获取数据,通过leftdata,rightdata带出数据
LeftBlank();//左侧空白区
StartPattern();//起始符
LeftDataPattern(leftdata);//左侧数据区
CenterDivisionPattern();//中间分隔符
RightDataPattern(rightdata);//右侧数据区
EndPattern();//结束符
}
voidmain()
{
initgraph(626,480,SHOWCONSOLE);//创建一个尺寸为640x480的绘图环境,同时显示控制台窗口
setbkcolor(WHITE);//设置背景色为深灰
cleardevice();//用背景色清空屏幕
while
(1)
{
startX=200;
startY=110;
height=100;
DrawEAN13();//画EAN13
}
getch();//按任意键退出
closegraph();}