识别条形码c语言
‘壹’ 怎样用c语言做一个条形码
一、条形码的读取
用过键盘口式的扫条码工具的朋友就知道,它就如同在键盘上按下数字键一样,基本不需任何编程和处理。但如果你使用的是其它接口的话,可能你就要为该设备编写通讯代码了。以下有一段简单的25针串口的条码读取器通讯代码。
Option Explicit
Dim sData As String
Private Sub Form_Load()
With MSComm1
.CommPort = 3 '设为COM3,试运行的系统而定,你可提供一个Combox让用户选择。
.PortOpen = True '打开通讯端口
End With
End Sub
Private Sub MSComm1_OnComm()
Dim EndPos As Integer
Select Case MSComm1.CommEvent
Case comEvReceive '当有数据传送过来时
sData = sData & Trim(MSComm1.Input)
'检索回车,通常读卡机每组数据结尾都返回一个回车作为结束符
EndPos = InStr(1, sData, Chr(13))
If EndPos = 0 Then '如果未结束就继续努力
Else '读完一组。
lblBarCode.Caption = sData '显示一组条形码
With lstBarCode
.AddItem Mid(sData, 1, EndPos - 1) '添加一组条形码到列表
End With
sData = "" '清空
End If
End Select
End Sub
Private Sub cmdEnd_Click()
MSComm1.PortOpen = False '关闭端口
End
End Sub
‘贰’ 用c语言编写函数,实现“计算商品条形码校验位
验证算法
‘叁’ 输入一个条码判断是不是教材教材的条码规则为长度13位前缀9787用c语言编程求解答
按照问题,程序应包含以下功能:
一、条码字符串输入及验证。
二、前缀字符串和条码字符串比较,方法很多:
1、可遍历字符串单字符比较。
2、将条码字符串第5个字符置0,然后用strcmp函数比较。
3、在输入条码字符串同时验证前4位的输入。
下面用两种方式代码演示:
#include<stdio.h>
#include<string.h>
#define M 13//条码最大位数
#define N 4//规则前缀位数
#define NS "9787"//前缀,位数必须与N对应
int inputAndCheck(char str1[],char str2[]);//方法一:输入的同时比较(自带位数限制)。是返回1,不是返回0
int checkStr(char str1[],char str2[]);//方法二:输入后比较用字符串函数比较(自带位数检测,小于M位返回0,多余13位截取),是返回1,不是返回0
int main()
{
char s1[N+1]=NS,s2[M+1]={0};
printf("方法一:输入同时比较 ");
if(inputAndCheck(s1,s2))printf("前%d位字符%s是教材条码 ",M,s2);
else printf("前%d位字符%s不是是教材条码 ",M,s2);
printf(" 方法二:输入后比较用字符串函数比较 ");
memset(s2,0,sizeof(char)*(M+1));//同一个变量用于两种方法演示,这里清空一下,实际代码可删除!!
printf("演示用的scanf函数输入,请不要超出%d位:",M),scanf("%s",s2);//注意:checkStr函数会检测参数长度,但这里用scanf输入,其本身不能数组越界
if(checkStr(s1,s2))printf("前%d位字符%s是教材条码 ",M,s2);
else printf("前%d位字符%s不是是教材条码 ",M,s2);
return 0;
}
int checkStr(char str1[],char str2[])
{
char cSave;
int flag=0;
if(strlen(str2)<M) return flag;
cSave=str2[N];
str2[N]=0;
flag=strcmp(str1,str2);
str2[N]=cSave;
str2[M]=0;//多余截取
return !flag;
}
int inputAndCheck(char str1[],char str2[])
{
int i=0,flag=1;
printf("输入13位(多余位数将被忽略):");
while(i<M)
{
str2[i]=getchar();
if(str2[i]==' ') continue;//位数不足,跳过回车键继续输入
if(i<N && str1[i]!=str2[i]) flag=0;
i++;
}
str2[M]=0;
while(getchar()!=' ');//清空输入缓存,避免干扰后续字符串输入
return flag;
}
‘肆’ 关于C语言的一个编程问题 急!!!!
以下程序只能检测输入的条形码的位数是否相符,但不知道你的weight是怎样检测条形码不合法的,我看了一下,好像weight码,最计算出来之后,最后才加到第13位去的,也就是说输入条形码时只橡旁橘有12位,第13位weight要通过计算才能得到,本程序能满足这个要求。
int main(){
char a[13]; int sum=0;int m=0;
char b[17];
int c[12];
gets(a);
cout<<a<<endl;
for(int i=0;a[i]!='\0';i++){m++;} //判断输入的字符个数
while(m!=12) //此循环用于检测输入的字启州符数是否合法。
{cout<<"条形码位数不足或过多,请重新输入"<<endl;
gets(a);
m=0;
for(int i=0;a[i]!='\0'梁团;i++)
{m++;}
}
for(int i=0; i<12; i++){c[i]=a[i]-'0';} //将输入的字符转换为int型整数。
for(int i=0;i<12;i++) //总码值计算
{
if(i%2==0){sum=sum+c[i]*1;}
else{sum=sum+c[i]*3;}
}
int k=0;
k=10-sum%10; //计算出来的第13位的码值。
int j=0;
for(int i=0;i<12;i++) //这个循环用于给输出的条形码在需要的地方加上破折号。
{
if(i==3){b[j]='-';b[j+1]=a[i];j=j+2;}
else if(i==9){b[j]='-';b[j+1]=a[i];j=j+2;}
else {b[j]=a[i];j++;}
}
b[14]='-';
b[15]=k+'0'; //最后一位条形码。
b[16]='\0'; //最后加上一个输出时的结束符。
cout<<b<<endl; //输出条形码
system("pause");
return 0;
}
‘伍’ c语言!!!怎样用char来编13位的barcode啊
商品条码数字的含义:
以条形码 693-69838-0001-3 为例
此条形码分为4个部分,从左到右分别为:
1-3位:共3位,对应该条码的693,是中国的国家代码之一。(690--695都是中国的代码,由国际上分配);
4-8位:共5位,对应该条码的69838,代表着生产厂商代码,由厂商申请,国家分配;
9-12位:共4位,对应该条码的0001,代表着厂内商品代码,由厂商自行确定;
第13位:共1位,对应该条码的3,是校验码,依据一定的算法,由前面12位数字计算而得到。第13位的计算方法:把条形码从右往左依次编序号为“……4,3,2,1。”从序号二开始把所有偶数序号位上的数相加求和,用求出的和乘3,再从序号三开始把所有奇数序号上的数相加求和,用求出的和加上刚才偶数序号上的数的和乘3的积,然后得出和。再用大于这个和的最小的10的倍数减去这个和,就得出校验码。
所以,编写barcode前12位是输入的要从其他的地方获取,只有第13位需要计算,程序应该为:(已经经过运行是可行的)
#include<stdio.h>
main()
{char c[15];
int i,dan,sh;
printf("请输入前12位:\n");
scanf("%s",c);
for(i=0;i<12;i++)
{
if(c[i]<48||c[i]>57){printf("输入出错.");break;} \*计算第13位*\
if(i%2==1)
dan+=c[i]-48;
else sh+=c[i]-48;}
sh=sh*3+dan;
c[12]=(10-sh%10)+48;
for(i=0;i<13;i++) \*输出*\
{if(i==3||i==8||i==12)printf("-");
printf("%c",c[i]);
}
printf("\n");
}
如乱的输入:
#include<stdio.h>
main()
{char c[20];
int i,dan,sh;
printf("请输入:\n");
scanf("%s",c);
for(i=0;i!='\0';i++) \*清除非0~9的数字*\
if(c[i]<48||c[i]>57)c[i]=c[++i];
for(i=0;i<12;i++) \*计算第13位*\
{
if(c[i]<48||c[i]>57){c[i]=c[++i];break;}
if(i%2==1)
dan+=c[i]-48;
else sh+=c[i]-48;}
sh=sh*3+dan;
c[12]=(10-sh%10)+48;
for(i=0;i<13;i++) \*输出*\
{if(i==3||i==8||i==12)printf("-");
printf("%c",c[i]);
}
printf("\n");
}
‘陆’ 如何用C语言输出 EAN-13条形码
这里有答案资料,希望有帮助:http://..com/question/4584440.html
‘柒’ 怎样从条形码读出商品信息
条形码只是一种编码方式,与编程语言无关,使用任意编程工具都可以实现。
条形码的识别原理
由于不同颜色的物体,其反射的可见光的波长不同,白色物体能反射各种波长的可见光,黑色物体则吸收各种波长的可见光,所以当条形码扫描器光源发出的光经光阑及凸透镜1后,照射到黑白相间的条形码上时,反射光经凸透镜2聚焦后,照射到光电转换器上,于是光电转换器接收到与白条和黑条相应的强弱不同的反射光信号,并转换成相应的电信号输出到放大整形电路.白条、黑条的宽度不同,相应的电信号持续时间长短也不同.但是,由光电转换器输出的与条形码的条和空相应的电信号一般仅10mV左右,不能直接使用,因而先要将光电转换器输出的电信号送放大器放大.放大后的电信号仍然是一个模拟电信号,为了避免由条形码中的疵点和污点导致错误信号,在放大电路后需加一整形电路,把模拟信号转换成数字电信号,以便计算机系统能准确判读.整形电路的脉冲数字信号经译码器译成数字、字符信息.它通过识别起始、终止字符来判别出条形码符号的码制及扫描方向;通过测量脉冲数字电信号0、1的数目来判别出条和空的数目.通过测量0、1信号持续的时间来判别条和空的宽度.这样便得到了被辩读的条形码符号的条和空的数目及相应的宽度和所用码制,根据码制所对应的编码规则,便可将条形符号换成相应的数字、字符信息,通过接口电路送给计算机系统进行数据处理与管理,便完成了条形码辨读的全过程.
编码规则
唯一性:同种规格同种产品对应同一个产品代码,同种产品不同规格应对应不同的产品代码。根据产品的不同性质,如:重量、包装、规格、气味、颜色、形状等等,赋予不同的商品代码。 永久性:产品代码一经分配,就不再更改,并且是终身的。当此种产品不再生产时,其对应的产品代码只能搁置起来,不得重复起用再分配给其它的商品。 无含义:为了保证代码有足够的容量以适应产品频繁的更新换代的需要,最好采用无含义的顺序码。
条形码的码制区别
UPC:(统一产品代码) 只能表示数字 有A、B、C、D、E四个版本 版本 A - 12 位数字 版本 E - 7 位数字 最后一位为校验位 大小是宽1.5" 高1 " ,而且背景要与清晰 主要使用于美国和加W拿大地区,用于工业、医药、仓库等部门
当UPC 作为十二位进行解码时,定义如下: 第一位 = 数字标识 (已经由UCC(统一代码委员会)所建立). 第2-6位 = 生产厂家的标识号(包括第一位) 第7-11 = 唯一的厂家产品代码 第12位 = 校验位(used for error detection)
Code 3 of 9 : 能表示字母、数字和其它一些符号共43个字符:A -Z,0 - 9,-.$/+%,pace 条形码的长度是可变化的 通常用“*”号作为起始、终止符 校验码不用 代码密度介于3 - 9.4个字符/每英寸 空白区是窄条的10倍 用于工业、图书、以及票证自动化管理上
Code 128: 表示高密度数据, 字符串 字符串可变长 符号内含校验码 有三种不同版本: A, B, and C 可用128个字符分别在 A, B, or C 三个字符串集合中 用于工业、仓库、零售批发
Interleaved 2-of-5 (I2 of 5): 只能表示数字0 -9 可变长度 连续性条形码,所有条与空都表示代码,第一个数字由条开始,第二个数字由空组成 空白区比窄条宽10倍 应用于商品批发、仓库、机场、生产/包装识别、工业中 条形码的识读率高,可适用于固定扫描器可靠扫描 在所有一维条形码中的密度最高
Codabar(库德巴条形码): 可表示数字0 - 9,字符$、+、 -、还有只能用作起始/终止符的a, b, c d四个字符
可变长度 没有校验位 应用于物料管理、图书馆、血站和当前的机场包裹发送中 空白区比窄条宽10倍 非连续性条形码,每个字符表示为4条3空
PDF417 (二维码): 多行组成的条形码 不需要连接一个数据库,本身可存储大量数据 应用于:医院、驾驶证、物料管理、货物运输 当条形码受一定破坏时,错误纠正能使条形码能正确解码 PDF417, 是Symbol科技公司于1990研制产品。它是一个多行、连续性、可变长、包含大量数据的符号标识。每个条形码有3 - 90行,每一行有一个起始部分、数据部分、终止部分。它的字符集包括所有128个字符,最大数据含量是1850个字符。
一维条形码只是在一个方向(一般是水平方向)表达信息,而在垂直方向则不表达任何信息,其一定的高度通常是为了便于阅读器的对准。
一维条形码的应用可以提高信息录入的速度,减少差错率,但是一维条形码也存在一些不足之处:
* 数据容量较小: 30个字符左右
* 只能包含字母和数字
* 条形码尺寸相对较大(空间利用率较低)
* 条形码遭到损坏后便不能阅读
在水平和垂直方向的二维空间存储信息的条形码, 称为二维条形码(2-dimensional bar code)。
与一维条形码一样,二维条形码也有许多不同的编码方法,或称码制。就这些码制的编码原理而言,通常可分为以下三种类型
1. 线性堆叠式二维码 是在一维条形码编码原理的基础上,将多个一维码在纵向堆叠而产生的。典型的码制如:Code 16K、Code 49、PDF417等。
2. 矩阵式二维码 是在一个矩形空间通过黑、白像素在矩阵中的不同分布进行编码。典型的码制如: Aztec、Maxi Code、QR Code、 Data Matrix等。
3. 邮政码 通过不同长度的条进行编码,主要用于邮件编码,如:Postnet、BPO 4-State。
在许多种类的二维条形码中,常用的码制有:Data Matrix, Maxi Code, Aztec, QR Code, Vericode, PDF417, Ultracode, Code 49, Code 16K 等,其中:
* Data Matrix 主要用于电子行业小零件的标识,如Intel的奔腾处理器的背面就印制了这种码。
* Maxi Code 是由美国联合包裹服务(UPS)公司研制的,用于包裹的分拣和跟踪。
* Aztec 是由美国韦林(Welch Allyn)公司推出的,最多可容纳3832个数字或3067个字母字符或1914个字节的数据。
‘捌’ 求一能从图片中识别条形码的c语言程序
怎么给你啊?
‘玖’ 怎样用C语言做一个条形码
一、条形码的读取
用过键盘口式的扫条码工具的朋友就知道,它就如同在键盘上按下数字键一样,基本不需任何编程和处理。但如果你使用的是其它接口的话,可能你就要为该设备编写通讯代码了。以下有一段简单的25针串口的条码读取器通讯代码。
Option Explicit
Dim sData As String
Private Sub Form_Load()
With MSComm1
.CommPort = 3 '设为COM3,试运行的系统而定,你可提供一个Combox让用户选择。
.PortOpen = True '打开通讯端口
End With
End Sub
Private Sub MSComm1_OnComm()
Dim EndPos As Integer
Select Case MSComm1.CommEvent
Case comEvReceive '当有数据传送过来时
sData = sData & Trim(MSComm1.Input)
'检索回车,通常读卡机每组数据结尾都返回一个回车作为结束符
EndPos = InStr(1, sData, Chr(13))
If EndPos = 0 Then '如果未结束就继续努力
Else '读完一组。
lblBarCode.Caption = sData '显示一组条形码
With lstBarCode
.AddItem Mid(sData, 1, EndPos - 1) '添加一组条形码到列表
End With
sData = "" '清空
End If
End Select
End Sub
Private Sub cmdEnd_Click()
MSComm1.PortOpen = False '关闭端口
End
End Sub
二、条形码的生成
看完以上关于条码读取的代码是否觉得很容易呢?对,在VB上编程本来就不难。以下关于条形码生成的代码也是很容易理解,只需使用一个OFFICE的附带的BarCode控件就可以轻松打印出11种不同标准的条形码,足以满足我们的要求。想起我书架上的一本书中的一篇用Turbo C编写条形码打印程序文章,长篇大论,那时不知看了n天,打了n小时字结果也不尽人意,现在真是幸福多了:)。废话说完,得回归正题。且看条形码生成的代码及有关说明。
源代码主要由两个窗体(frmMain主窗体和frmOption条码设置窗体)和两个模块组成(modGetScreen.bas、SysDLG32.bas)。考虑到篇幅,这里只列出部分较为关键的代码。
新建一个标准工程,添加一个名为(Microsoft Access BarCode Control9)的条形码部件,并添加一个条码控件到窗口,并将窗口改名为frmMain,如图所示。由于控件比较多,这里不便细说,详细内容请看源代码。
模块modGetScreen.bas代码如下:
Option Explicit
'声明BitBlt、GetDesktopWindow、GetWindowDC、ReleaseDC这几个API函数略
Public RegUser As Boolean
Sub GetObjImage1(Obj As Object, OwnerForm As PictureBox, Picture1 As PictureBox)
'hDC
Dim hWndDesk As Long
Dim hDCDesk As Long
'区域表达变量
Dim x As Long
Dim y As Long
Dim w As Long
Dim h As Long
x = Obj.Left Screen.TwipsPerPixelX
y = Obj.Top Screen.TwipsPerPixelY
w = Obj.Width Screen.TwipsPerPixelX
h = Obj.Height Screen.TwipsPerPixelY
hDCDesk = OwnerForm.hdc
'取出图像
Call BitBlt(Picture1.hdc, 0, 0, w, h, hDCDesk, x, y, vbSrcCopy)
Call ReleaseDC(hWndDesk, hDCDesk)
End Sub
主窗体frmMain.frm部分代码如下:
Private Sub cmdPrint_Click()
'生成条形码图像
Dim r As Long, i As Integer, t As String,cfile As String '临时变量
t = BarCode
For i = 0 To Val(Times) - 1
BarCode1.Value = BarCode + i
DoEvents
Picture1.Refresh
GetObjImage1 BarCode1, Conel, Picture1
If RegUser = False Then '如果未注册添加MASK标记
Picture1.PaintPicture Picture2.Picture, 300, 300
End If
If Dir(SavePath, vbDirectory) = "" Then MkDir SavePath
SavePath = SavePath & IIf(Right(SavePath, 1) <> "", "", "")
cfile = SavePath & BarCode1.Value & ".bmp"
SavePicture Picture1.Image, cfile '将条形码保存为图像文件以便打印
Next
BarCode = t
End Sub
条形码设置窗体frmOption.frm代码如下:
Option Explicit
'条形码设置模块
Private Sub cboBig_Click()
BarCode1.Style = cboBig.ListIndex '改变标准
End Sub
Private Sub cboDirection_Click()
BarCode1.Direction = cboDirection.ListIndex '改变方向
End Sub
Private Sub cboLine_Click()
BarCode1.LineWeight = cboLine.ListIndex '改变线宽
End Sub
Private Sub cboSmall_Click()
BarCode1.SubStyle = cboSmall.ListIndex '改变样式
End Sub
Private Sub Check1_Click()
BarCode1.ShowData = Check1.Value '是否显示数据
End Sub
Private Sub cmdChange_Click()
'设置长、宽大小
BarWidth = BarCode1.Height
BarHeight = BarCode1.Width
cmdRefresh_Click
End Sub
Private Sub cmdOK_Click()
'传送条形码设定到主界面
With frmMain.BarCode1
.LineWeight = BarCode1.LineWeight
.Style = BarCode1.Style
.SubStyle = BarCode1.SubStyle
.Direction = BarCode1.Direction
.Width = BarCode1.Width
.Height = BarCode1.Height
.ShowData = BarCode1.ShowData
Me.Hide
End With
With frmMain
.Picture1.Width = .BarCode1.Width
.Picture1.Height = .BarCode1.Height
.Conel.Width = .BarCode1.Width
.Conel.Height = .BarCode1.Height
End With
End Sub
Private Sub cmdRefresh_Click()
BarCode1.Width = BarWidth
BarCode1.Height = BarHeight
End Sub
Private Sub Form_Load()
LoadBarInfo
BarWidth = BarCode1.Width
BarHeight = BarCode1.Height
End Sub
Sub LoadBarInfo() '初始化选项
LoadBigClass cboBig
LoadSmallClass cboSmall
LoadLineSize cboLine
LoadDirection cboDirection
End Sub
Sub LoadBigClass(cbo As ComboBox) '条码标准
With cbo
.AddItem "UPC-A"
.AddItem "UPC-E"
.AddItem "EAN-13"
.AddItem "EAN-8"
.AddItem "Case Code"
.AddItem "Codabar (NW-T)"
.AddItem "Code-39"
.AddItem "Code-128"
.AddItem "U.S. Postnet"
.AddItem "U.S. Postal FIM"
.AddItem "JP Post"
.ListIndex = 2
End With
End Sub
Sub LoadSmallClass(cbo As ComboBox) '条码样式
With cbo
.AddItem "Standard"
.AddItem "2-Digit Supplement"
.AddItem "5-Digit Supplement"
.AddItem "POS Case Code"
.ListIndex = 0
End With
End Sub
许多人在编写数据库应用程序时,都想要加上条形码功能加强工作效率,尤其是销售管理,图书馆管理这类流量大的应用软件,但由于条形码技术难以掌握、标谁又多以及过去的技术种种原因,使得许多人望而却步。本文介绍的一套简单实用的条形码解决方法,希望能帮助各位完善软件系统的功能。文章源代码可以发信到[email protected]索取。