識別條形碼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]索取。