条码解析

http://blog.csdn.net/billanking/article/details/5641563


/*
所有解码函数返回值: 1:成功 2:检查码不对 0:失败 3:非本类条码
*/

 


//-----------EAN13码解码算法------------------------------------------------------------------------------
/*
EAN_13主要用在零售市场上,尤其在超级市场上。
为一固定长度13的数字条码。
编码原则:
1:左护码,表示EAN_13的开始
2:中护码,用来区隔左资料与右资料
3:右护码,表示EAN_13的结束
4:左资料码,包括6个数字资料,包括国家代码和厂商代码
5:右资料码,包括5个数字资料,代表产品的代码,固定使用C组来编码
6:检查码,1个数字,由导入值及左资料码,右资料码总共12位数字运算得来

7:导入值,非条码,其资料来源是依照左资料码的排列次序得来的。也就是第一个数字,固定为A编码

导入值 N1 N2 N3 N4 N5 N6
0 A A A A A A
1 A A B A B B
2 A A B B A B
3 A A B B B A
4 A B A A B B
5 A B B A A B
6 A B B B A A
7 A B A B A B
8 A B A B B A
9 A B B A B A
8:ENA_13是一种(7,2)码,即每个数字都含有7个区间,每个码固定有2个空白,及2条细条
*/

/*
返回值: 1:成功 2:检查码不对 0:失败 3:非本类条码
*/
int CodeBarParse::EAN13(unsigned char *sbar)
{
unsigned char Drz; //导入值
unsigned char LCode[10][7]={"AAAAAA","AABABB","AABBAB","AABBBA","ABAABB","ABBAAB","ABBBAA","ABABAB","ABABBA","ABBABA"};
unsigned char AB_Code[31][8]={"0001101","0011001","0010011","0111101","0100011","0110001","0101111","0111011","0110111","0001011",
"0100111","0110011","1011011","0100001","0011101","0111001","0000101","0010001","0001001","0010111",
"1110010","1100110","1101100","1000010","1011100","1001110","1010000","1000100","1001000","1110100"};
int c=0;
int sbar_p=0,sbar_p_c;
unsigned char cr,cj,abp,j;
unsigned char LB[7];
barcode_ip = 1;
//-----------------导入值-----------------------
for(Drz=0;Drz<10;Drz++){
sbar_p = 3;
c = 0;
for(cr=0;cr<7;cr++){
if(sbar[sbar_p++]!=AB_Code[Drz][cr]){
c = 1;break;
}
}
if(c==0) break;
}
if((c==1)&&(Drz>=10)) return 0;
barcode[barcode_ip++] = Drz;
//-----------------左资料--------------------------
j = 20;
for(cj=1;cj<6;cj++){
abp = 0;
sbar_p_c = sbar_p;
for(;abp<j;abp++){
sbar_p = sbar_p_c;
c = 0;
for(cr=0;cr<7;cr++){
if(sbar[sbar_p++]!=AB_Code[abp][cr]){
c = 1;break;
}
}
if(c==0) break;
}
if((c==1)&&(abp>=j)) return 0;
if(abp<10) LB[cj] = 'A';
else LB[cj] = 'B';
barcode[barcode_ip++] = (abp%10);
}
sbar_p+=5;
for(cj=0;cj<10;cj++){
c=0;
for(cr=1;cr<6;cr++){
if(LCode[cj][cr]!=LB[cr]){
c =1;
break;
}
}
if(c==0) break;
}
if((c==1)&&(cj>=10)) return 0;
barcode[0] = cj;
//-----------------右资料-----------------------------
j = 30;
for(cj=0;cj<6;cj++){
abp = 20;
sbar_p_c = sbar_p;
for(;abp<j;abp++){
sbar_p = sbar_p_c;
c = 0;
for(cr=0;cr<7;cr++){
if(sbar[sbar_p++]!=AB_Code[abp][cr]){
c = 1;break;
}
}
if(c==0) break;
}
if((c==1)&&(abp>=j)) return 0;
barcode[barcode_ip++] = (abp%10);
}
//-----------------检查码----------------------------------
abp = 0;
abp=(barcode[11]+barcode[9]+barcode[7]+barcode[5]+barcode[3]+barcode[1])*3;
abp = abp + (barcode[0]+barcode[2]+barcode[4]+barcode[6]+barcode[8]+barcode[10]);
abp = abp%10;
for(c=0;c<barcode_ip;c++) barcode[c] |= 0x30;
if(abp==0) abp = 0x30;
else abp = (10-abp)+0x30;
barcode[13] = 0;
if(abp!=barcode[12]){
return 2;
}
return 1;

}
//-----------EAN13码解码算法END----------------------------------------------------------------------------

//-----------UPC_A码解码算法-------------------------------------------------------------------------------
/*
UPC_A的前6个字符都是由A集编码组成,后6个由C集编码组成。
UPC-A条码是EAN-13条码的一种特殊形式,UPC-A条码与EAN-13码中N1='0'兼容。

*/
int CodeBarParse::UPC_A(unsigned char *sbar)
{
unsigned char LCode[10][7]={"AAAAAA","AABABB","AABBAB","AABBBA","ABAABB","ABBAAB","ABBBAA","ABABAB","ABABBA","ABBABA"};
unsigned char AB_Code[31][8]={"0001101","0011001","0010011","0111101","0100011","0110001","0101111","0111011","0110111","0001011",
"0100111","0110011","1011011","0100001","0011101","0111001","0000101","0010001","0001001","0010111",
"1110010","1100110","1101100","1000010","1011100","1001110","1010000","1000100","1001000","1110100"};
int c=0;
int sbar_p=0,sbar_p_c;
unsigned char cr,cj,abp,j;
unsigned char LB[7];
barcode_ip = 0;
//-----------------左资料--------------------------
j = 20;
sbar_p = 3;
for(cj=0;cj<6;cj++){
abp = 0;
sbar_p_c = sbar_p;
for(;abp<j;abp++){
sbar_p = sbar_p_c;
c = 0;
for(cr=0;cr<7;cr++){
if(sbar[sbar_p++]!=AB_Code[abp][cr]){
c = 1;break;
}
}
if(c==0) break;
}
if((c==1)&&(abp>=j)) return 0;
if(abp<10) LB[cj] = 'A';
else LB[cj] = 'B';
barcode[barcode_ip++] = (abp%10);
}
sbar_p+=5;
//-----------------右资料-----------------------------
j = 30;
for(cj=0;cj<6;cj++){
abp = 20;
sbar_p_c = sbar_p;
for(;abp<j;abp++){
sbar_p = sbar_p_c;
c = 0;
for(cr=0;cr<7;cr++){
if(sbar[sbar_p++]!=AB_Code[abp][cr]){
c = 1;break;
}
}
if(c==0) break;
}
if((c==1)&&(abp>=j)) return 0;
barcode[barcode_ip++] = (abp%10);
}
//-----------------检查码----------------------------------
abp = 0;
abp=(barcode[11]+barcode[9]+barcode[7]+barcode[5]+barcode[3]+barcode[1])*3;
abp = abp + (barcode[0]+barcode[2]+barcode[4]+barcode[6]+barcode[8]+barcode[10]);
abp = abp%10;
for(c=0;c<barcode_ip;c++) barcode[c] |= 0x30;
if(abp==0) abp = 0x30;
else abp = (10-abp)+0x30;
barcode[13] = 0;
if(abp!=barcode[12]){
return 2;
}
return 1;
}
//-----------UPC_A码解码算法END----------------------------------------------------------------------------

//-----------UPC_E码解码算法-------------------------------------------------------------------------------
/*
UPC-E码只用於国别码为0的商品
左护线:为辅助码,不具任何意义,仅供列印时作为识别之用,逻辑型态为010101,其中0代表细白,1代表细黑。
右护线:同UPC-A码,逻辑型态为101。
检查码:为UPC-A码原形的检查码,其作用为一导入值,并不属於资料码的一部份。
资料码:扣除第一码固定为0外,UPC-E实际参与编码的部份只有六码,其编码方式,视检查码的值来决定,如表 2.3所示。奇资料码与偶资料码的逻辑值如表 2.4所示。
sprintf((char*)bar,"101 0010001 0110111 0100001 0100011 0001011 0110011 010101");
*/
int CodeBarParse::UPC_E(unsigned char *sbar,unsigned int ssl)
{
unsigned char checks[10][7]={"BBBAAA","BBABAA","BBAABA","BBAAAB","BABBAA","BAABBA","BAAABB","BABABA","BABAAB","BAABAB"};
unsigned char CodeI[20][8]={"0001101","0011001","0010011","0111101","0100011","0110001","0101111","0111011","0110111","0001011",
"0100111","0110011","0011011","0101001","0011101","0111001","0100101","0010001","0001001","0010111"};

unsigned char checksum[7];
unsigned char c_p=0,c;
unsigned short i,abp,cr;
unsigned char shar_p,shar_p_c;
shar_p = 3;
barcode_ip = 0;
for(i=0;i<6;i++){
if(shar_p>ssl)break;
shar_p_c = shar_p;
for(abp=0;abp<20;abp++){
shar_p = shar_p_c;
c = 0;
for(cr=0;cr<7;cr++){
if(sbar[shar_p++]!=CodeI[abp][cr]){
c = 1;break;
}
}
if(c==0) break;
}
if((c==1)&&(abp>=20)) return 0;
cr = abp%10;
barcode[barcode_ip++] = cr+0x30;
if(abp>9) checksum[c_p++] = 'B';
else checksum[c_p++] = 'A';
}
barcode[barcode_ip++] = 0;
if(c_p>=6){
for(abp=0;abp<10;abp++){
c = 0;
for(cr=0;cr<6;cr++){
if(checksum[cr]!=checks[abp][cr]){
c = 1;break;
}
}
if(c==0) break;
}
if(c==1 && abp>=10) return 2;
else return 1;
}
else return 0;
return 1;
}
//-----------UPC_E码解码算法END----------------------------------------------------------------------------

//-----------EAN8码解码算法--------------------------------------------------------------------------------
int CodeBarParse::EAN8(unsigned char *sbar)
{
unsigned char LCode[10][7]={"AAAAAA","AABABB","AABBAB","AABBBA","ABAABB","ABBAAB","ABBBAA","ABABAB","ABABBA","ABBABA"};
unsigned char AB_Code[31][8]={"0001101","0011001","0010011","0111101","0100011","0110001","0101111","0111011","0110111","0001011",
"0100111","0110011","0011011","0100001","0011101","0111001","0000101","0010001","0001001","0010111",
"1110010","1100110","1101100","1000010","1011100","1001110","1010000","1000100","1001000","1110100"};
int c=0;
int sbar_p=0,sbar_p_c;
unsigned char cr,cj,abp,j;
unsigned char LB[7];
barcode_ip = 0;
//-----------------左资料--------------------------
j = 20;
sbar_p = 3;
for(cj=0;cj<4;cj++){
abp = 0;
sbar_p_c = sbar_p;
for(;abp<j;abp++){
sbar_p = sbar_p_c;
c = 0;
for(cr=0;cr<7;cr++){
if(sbar[sbar_p++]!=AB_Code[abp][cr]){
c = 1;break;
}
}
if(c==0) break;
}
if((c==1)&&(abp>=j)) return 0;
if(abp<10) LB[cj] = 'A';
else LB[cj] = 'B';
barcode[barcode_ip++] = (abp%10);
}
sbar_p+=5;
//-----------------右资料-----------------------------
j = 30;
for(cj=0;cj<4;cj++){
abp = 20;
sbar_p_c = sbar_p;
for(;abp<j;abp++){
sbar_p = sbar_p_c;
c = 0;
for(cr=0;cr<7;cr++){
if(sbar[sbar_p++]!=AB_Code[abp][cr]){
c = 1;break;
}
}
if(c==0) break;
}
if((c==1)&&(abp>=j)) return 0;
barcode[barcode_ip++] = (abp%10);
}
//-----------------检查码----------------------------------
abp = 0;
abp=(barcode[1]+barcode[3]+barcode[5]);
abp = abp + (barcode[0]+barcode[2]+barcode[4]+barcode[6])*3;
abp = abp%10;
if(abp==0) abp = 0x30;
else abp = (10-abp)+0x30;
for(c=0;c<barcode_ip;c++) barcode[c] |= 0x30;
barcode[8] = 0;
if(abp!=barcode[7]){
return 2;
}
return 1;
}
//-----------EAN8码解码算法END----------------------------------------------------------------------------

//-----------Code39码解码算法------------------------------------------------------------------------------
/*
1:每一个Code 39码字元条码,都由五条细线及四条空白构成。
2:每个字元条码的最前字元及最后字元都由细线包裹起来。
3:每个条码字符共9个单元,其中3个宽单元和6个窄单无,共包括5个条和4个空。
4:Code39码是目前应用最广泛的条码,包含了数字及英文字母(大写)共44种字元。被广泛应用于超级市场及零售业。
5:每个条码字符占12个单位的条宽
6:Code39码可以通过两个字符来组合表示128个字符。
7:39码必须包含一个不具任何意义的空白(或细白,其逻辑值为0)
8:起始码+资料码+终止码
9:校验字符为所有的资料码的字符序值和除以43的余数所对应字符
10:可进行双向译码。
*/
int CodeBarParse::Code39(unsigned char *sbar,unsigned int slen)
{
unsigned char CodeI[44][13]={"101001101101","110100101011","101100101011","110110010101","101001101011","110100110101","101100110101","101001011011","110100101101","101100101101",
"110101001011","101101001011","110110100101","101011001011","110101100101","101101110101","101010011011","110101001101",
"101101001101","101011001101","110101010011","101101010011","110110101001","101011010011","110101101001","101101101001",
"101010110011","110101011001","101101011001","101011011001","110010101011","100110101011","110011010101","100101101011",
"110010110101","100110110101",
"100101011011","110010101101","100110101101","100100100101","100100101001","100101001001","101001001001","100101101101"
};
//-(36) . 空白  $ / + % *
int si,t,k,t_c=1000;
unsigned char flag=0;//状态(1:开始符,2:结束符)
unsigned char c=0;
unsigned int si_c;
unsigned long checksum=0;
barcode_ip = 0;
for(si=0;si<slen;){
si_c = si;
for(t=0;t<44;t++){
c = 0;
si = si_c;
for(k=0;k<12;k++){
if(CodeI[t][k]!=sbar[si++]){
c = 1;
break;
}
}
if(c==0)break;
}
if((c==1)&&(t>=44)) return 0;
if(t==43){
if(flag==0) flag++;
else if(flag==1){
flag++;
break;
}
}
else{
if(flag>0){
if((checksum%43!=t) || (barcode_ip==0)){ //校验
while(1){
if(t_c<500){
c = t;
t = t_c;
t_c = 2000;
}
else if(t_c==2000){
t = c;
t_c = 1000;
}
checksum += t;
if(t<10) barcode[barcode_ip++] = t+48;
else if((t>=10)&&(t<36)) barcode[barcode_ip++] = t+55;
else if(t==36) barcode[barcode_ip++] = '-';
else if(t==37) barcode[barcode_ip++] = '.';
else if(t==38) barcode[barcode_ip++] = ' ';
else if(t==39) barcode[barcode_ip++] = '

;
else if(t==40) barcode[barcode_ip++] = 0x25;
else if(t==41) barcode[barcode_ip++] = '+';
else if(t==42) barcode[barcode_ip++] = 0x2F;
else if(t==43) barcode[barcode_ip++] = '*';
if(t_c==1000) break;
}
}
else{
t_c=t;
}
}
}
if(sbar[si++]!='0') return 2;
}
barcode[barcode_ip++] = 0;
if(flag==2) return 1;
else return 2;
}
//-----------Code39码解码算法END--------------------------------------------------------------------------------

 

//-----------Code128码解码算法----------------------------------------------------------------------------------
/*
1:具有A,B,C三种编码,提供标准的ASCII的128个字符的编码
2:可双向扫描处理
3:可自行加上检查码
4:条码长度可自由调整,但包括起码和终止码在內,不可超过232个字元
5:同一个128码,可以采用不同的方式进行编码。藉由A、B、C三种不同编码规则的互换可扩大字符选择的范围,也可缩短编码的长度。

128码的编码方式
  128码有三种不同类型的编码方式,对于选择何种编码方式,则决定于起始码的內容。
   起始码

编码类别 逻辑型态 相对值
CODE A 11010000100 103
CODE B 11010010000 104
CODE C 11010011100 105

   终止码
无论是采用A、B、C何种编码方式,128码的终止码均为固定的一种性能,其逻辑型态皆为1100011101011。
6:Code128与Code39码具有很大的相似性。都广泛运用在企业内部管理、生产流程、物流控制系统方面。
不同的在于Code 128比Code 39能表现更多的字符,单位长度里的编码密度更高。
7:每个字符由3个条、3个空、11个单元构成,字符串可变长;
8:字符集
字符集A:{大写字母,数字字符,标点字符,控制字符(ASCII值为00到95的字符),7个控制字符(字符值96~102)}
字符集B:{大写字母,数字字符,标点字符,小写字母字符(ASCII值为32到127的字符),7个控制字符(字符值96~102)}
字符集C:{100个数字(00~99),以及3个特殊字符},适用字符集C时,用一个符号字符表示两个数字。

9:切换字符和转换字符。(控制字符序列中)
A:切换字符CodeA(B或C)将符号字符集从先前确定的字符集转变到切换字符指定的新的字符集。
这种转变适用于切换字符之后的所有字符址到符号结束或遇到另一个切换字符或转换字符。
B:转换字符SHIFT将转换字符之后和(一个字符)从字符集A转换到字符集B,或从字符集B转换到字符集A。
在被转换字符后边的字符将恢复为转换字符前定义的字符集A或字符集B,被转换的符号字符不能是切换字符或转换字符。
10:符号检验字符

*/
int CodeBarParse::Code128(unsigned char *sbar,unsigned int slen)
{
unsigned char CodeI[107][12]={"11011001100","11001101100","11001100110","10010011000","10010001100","10001001100","10011001000","10011000100","10001100100","11001001000","11001000100",
"11000100100","10110011100","10011011100","10011001100","10111001100","10011101100","10011100110","11001110010","11001011100","11001001110","11011100100",
"11001110100","11101101110","11101001100","11100101100","11100100110","11101100100","11100110100","11100110010","11011011000","11011000110","11000110110",
"10100011100","10001011000","10001000110","10110001000","10001101000","10001100010","11010001000","11000101000","11000100010","10110111000","10110111000",
"10001101110","10111011000","10111000110","10001110110","11101110110","11010001110","11000100110","11011101000","11011100010","11011101110","11101011000",
"11101000110","11100010110","11101101000","11101100010","11100011010","11101111010","11001000010","11110001010","10100110000","10100001100","10010110000",
"10010000110","10000101100","10000100110","10110010000","10110000100","10011010000","10011001010","10000110100","10000110010","11000010010","11001010000",
"11110111010","11000010100","10001111010","10100111100","10010111100","10010011110","10111100100","10011110100","10011110010","11110100100","11110010100",
"11110010010","11011011110","11011110110","11110110110","10101111000","10100011110","10001011110","10111101000","10111100010","11110101000","11110100010",
"10111011110","10111101110","11101011110","11110101110","11010000100","11010010000","11010011100","11000111010"};

unsigned char bm_flag,cur_bm; //编码方式
unsigned char shitf_s=0;
unsigned char c,cs;
unsigned int si=0,si_c;
unsigned int t,k;

unsigned long checksum=0;
unsigned short cid=1;
unsigned char check=0;
barcode_ip = 0;
for(si=0;si<slen;si++){
si_c = si;
for(t=0;t<107;t++){
c = 0;
si = si_c;
for(k=0;k<11;k++){
if(CodeI[t][k]!=sbar[si++]){
c = 1;
break;
}
}
if(c==0){ si--;break;}
}
if((c==1)&&(t>=107)) return 0;
if(t<103){
if(cur_bm==1){
if(t<=63) cs = t+32;
else{
if((t>=64) && (t<=95)) cs = t-64;
else cs = 0x20;
}
}
else if(cur_bm==2){
if(t<=95) cs = t+32;
else cs = 0x20;
}
else if(cur_bm==3){
cs = t;
}
if((checksum%103)==t) check=1;
else check=0;
checksum = checksum + (cid*t);
cid++;
if(cur_bm==3){
if(t>9){
barcode[barcode_ip++] = (t/10)+0x30;
t = t%10;
}
barcode[barcode_ip++] = t+0x30;
}
else barcode[barcode_ip++] = cs;
if(shitf_s==1){
shitf_s = 0;
cur_bm = bm_flag;
}
}
else if(t==103){ bm_flag = 1; cur_bm = bm_flag; checksum = 103;}
else if(t==104){ bm_flag = 2; cur_bm = bm_flag; checksum = 104;}
else if(t==105){ bm_flag = 3; cur_bm = bm_flag; checksum = 105;}
else if(t==98){
shitf_s = 1;
if(bm_flag==1) cur_bm = 2;
else cur_bm = 1;
}
else if(t==106){
break;
//if(sbar[si++]=='1')
//if(sbar[si++]=='1')
}
}
if(check==1){
if(barcode_ip>0){
if((cs>9) && (cur_bm==3)) barcode_ip--;
barcode_ip--;
}
}
barcode[barcode_ip] = 0;
return 1;
}
//-----------Code128码解码算法END-------------------------------------------------------------------------------


//-----------交插25码解码算法E---------------------------------------------------------------------------------
/*
interleaved 2 of 5 bar code
密度较高,适用于运输,仓库,工业生产线,图书情报等领域。
是一种连续型,非定长,具有自检验功能,且条空都且示信息的双向条码

A:条码符号由左侧空白区,超始符,数据符,终止符及右空白区构成。它的每个条码数据符都由5个单元组成。其中二个是宽
 单元(1表示),其余是窄单无(0表示)
B:组成条码符号的条码数据符个数为偶数
C:条码符号从左到右,表示奇数位字符的条码数据符由条组成,表示偶数位字符的条码数据符由空组成。
D:条码数据符所表示的字符个数为奇数时,庆在字符串左端添加'0'.
E:起始符包括两个窄条和两个窄空。
F:终止符包括两个条(一个宽,一个窄条)
*/

int CodeBarParse::Interleaved25(unsigned char *sbar,unsigned int slen)
{
unsigned char CodeI[10][6]={"00110","10001","01001","11000","00101","10100","01100","00011","10010","01010"};
unsigned char ca[6],cb[6];
unsigned char cab_p=0;
int jo=0;
unsigned int si=4;

unsigned char c;
unsigned int i,j;
barcode_ip = 0;
ca[0] = 0; cb[0] = 0;
for(;si<slen;si++){
if(sbar[si]=='1'){
if(jo<0){
if(jo<-1)cb[cab_p] = '1';
else cb[cab_p] = '0';
cab_p++;
if(cab_p>=5){
for(i=0;i<10;i++){
c = 0;
for(j=0;j<5;j++){
if(CodeI[i][j]!=ca[j]){
c = 1;
break;
}
}
if(c==0) break;
}
if(c==1 && i>=10) return 0;
if(barcode_ip==0){
if(i!=0) barcode[barcode_ip++] = i+0x30;
}
else barcode[barcode_ip++] = i+0x30;
//------------------------------
for(i=0;i<10;i++){
c = 0;
for(j=0;j<5;j++){
if(CodeI[i][j]!=cb[j]){
c = 1;
break;
}
}
if(c==0) break;
}
if(c==1 && i>=10) return 0;
barcode[barcode_ip++] = i+0x30;
cab_p = 0; ca[0] = 0; cb[0] = 0;
}
jo=1;
}
else jo++;
}
else{
if(jo>0){
if(jo>1) ca[cab_p] = '1';
else ca[cab_p] = '0';

jo=-1;
}
else jo--;
}
}
barcode[barcode_ip++] = 0;
if(ca[0]!='1') return 2;
if(cb[0]!='0') return 2;
return 1;
}
//-----------交插25码解码算法END-------------------------------------------------------------------------------

//-----------Codebar码解码算法---------------------------------------------------------------------------------
/*

1:适用于医疗卫生,图书情报等领域
2:库德巴条码是一种非连续型,非定长,具有自校验功能的双向条码。由条码字符及对庆的人供人识别的字符组成
3:由左侧空白区,起始符,数据符,终止符,及右侧空白区构成。它的每一个条码字符由七个单元组成,四个条和三个空组成,
 其中两个或三个单元是宽单元(用1表示),其余是窄单元(用0表示)。
*/
int CodeBarParse::Codebar(unsigned char *sbar,unsigned int slen)
{
unsigned char CodeI[20][8]={"0001001","0010001","0001010","1000100","0100001","1000001","0001100","0010100","0100100","1000010",
"0100010","0010010","1011000","1101000","1110000","0111000","0100011","0001110","0001011","0010011"};

unsigned char ca[8];
unsigned char ca_p=0;
unsigned char flag=0;
short jo=0;
unsigned int si=0;

unsigned char c;
unsigned int i,j;
unsigned char con=0;
barcode_ip = 0;
for(si=0;si<slen;si++){
if(sbar[si]=='1'){
if(jo<0){
if(jo<-1) flag = '1';
else flag = '0';
if(ca_p==1) ca[4] = flag;
else if(ca_p==3) ca[5] = flag;
else if(ca_p==5) ca[6] = flag;
ca_p++;
jo=1;
}
else jo++;
if(si==slen-1) con = 1;
else con=0;
}
else con = 1;
if(con==1){
if(jo>0){
if(jo>1) flag='1';
else flag = '0';
if(ca_p==0) ca[0] = flag;
else if(ca_p==2) ca[1] = flag;
else if(ca_p==4) ca[2] = flag;
else if(ca_p==6) ca[3] = flag;
ca_p++;
jo = -1;
if(ca_p>6){
for(i=0;i<20;i++){
c = 0;
for(j=0;j<7;j++){
if(CodeI[i][j]!=ca[j]){
c = 1; break;
}
}
if(c==0)break;
}
if(c==1 && i>=20){
if(barcode_ip==0) return 3;
else return 0;
}
if(i<10) barcode[barcode_ip++] = i+0x30;
else if(i==10) barcode[barcode_ip++] = '

;
else if(i==11) barcode[barcode_ip++] = '-';
else if(i==12) barcode[barcode_ip++] = ':';
else if(i==13) barcode[barcode_ip++] = 0x2F;
else if(i==14) barcode[barcode_ip++] = '.';
else if(i==15) barcode[barcode_ip++] = '+';
ca_p=0;
jo=0;
}
}
else jo--;
}
}
barcode[barcode_ip++] = 0;
return 1;
}

//-----------Codebar码解码算法END-------------------------------------------------------------------------------

//-----------Code93码解码算法-------------------------------------------------------------------------------
/*
1:密度比39码要高点,采用双校验法,安全性要高
2:每个字符由三个条三个空组成。
3:左侧空白区,起始码,资料区,检查码C,检查码K,结束码,右侧空白区组成
4:可表示0~9,A~Z,符号(-,.,空格,$,/,+,%),控制码($,%,/+)-(!,#,&,@)
5:结束符为1010111101

存在一点问题(K检验对不上位)
*/
int CodeBarParse::Code93(unsigned char *sbar,unsigned int slen)
{
unsigned char CodeI[49][10]={"100010100","101001000","101000100","101000010","100101000","100100100","100100010","101010000","100010010","100001010",
"110101000","110100100","110100010","110010100","110010010","110001010","101101000","101100100","101100010","100110100",
"100011010","101011000","101001100","101000110","100101100","100010110","110110100","110110010","110101100","110100110",
"110010110","110011010","101101100","101100110","100110110","100111010","100101110","111010100","111010010","111001010",
"101101110","101101110","110101110","100100110","111011010","111010110","100110010","101011110","101011110"};

int si,t,k;
unsigned char flag=1;//状态(1:开始符,2:结束符)
unsigned char c=0;
unsigned int si_c;
unsigned long checksumC=0,checksumK;
barcode_ip = 0;
for(si=9;si<slen;){
si_c = si;
for(t=0;t<49;t++){
c = 0;
si = si_c;
for(k=0;k<9;k++){
if(CodeI[t][k]!=sbar[si++]){
c = 1;
break;
}
}
if(c==0)break;
}
if((c==1)&&(t>=49)) {
if(barcode_ip>3) break;
else return 0;
}
if(t==47){
if((si+1)==slen){ flag++; break;}
flag = 1;
}
else if(t==48){
flag++;
break;
}
else{
barcode[barcode_ip++] = t;
}
}
t = 1;
if(barcode_ip<3) return 3;
for(si=barcode_ip-3;si>=0;){
checksumC = checksumC + (barcode[si]*t);
t++;
if(t>20) t=1;
if(si==0) break;
else si--;
}
t = 2;
checksumC = checksumC%47;
checksumK = checksumC;
for(si=barcode_ip-3;si>=0;){
checksumK = checksumK + (barcode[si]*t);
t++;
if(t>15) t=1;
if(si==0) break;
else si--;
}
checksumK = checksumK%47;
if(barcode[barcode_ip-2]==checksumC) c = 0;
else c=1;
barcode_ip = barcode_ip - 2;
for(si=0;si<barcode_ip;si++){
if(t<10) barcode[si] = barcode[si]+48;
else if((t>=10)&&(t<36)) barcode[si] = barcode[si]+55;
else if(t==36) barcode[si] = '-';
else if(t==37) barcode[si] = '.';
else if(t==38) barcode[si] = ' ';
else if(t==39) barcode[si] = '

;
else if(t==40) barcode[si] = 0x25;
else if(t==41) barcode[si] = '+';
else if(t==42) barcode[si] = 0x2F;
}
barcode[barcode_ip++] = 0;
if(flag==2){
if(c==1) return 2;
return 1;
}
else return 2;
}
//-----------Code93码解码算法END-------------------------------------------------------------------------------


//------------UCC/EAN-128码解码算法----------------------------------------------------------------------------
/*
在code128的基础上,起始符后跟一个功能符,来表示与Code128的不同。

*/
int CodeBarParse::UCC_EAN128(unsigned char *sbar,unsigned int slen)
{
return 1;
}

//------------UCC/EAN-128码解码算法END----------------------------------------------------------------------------

//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@编码@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
int CodeBarParse::Ecode39(unsigned char *data,unsigned char *bar)
{
unsigned char CodeI[44][13]={"101001101101","110100101011","101100101011","110110010101","101001101011","110100110101","101100110101","101001011011","110100101101","101100101101",
"110101001011","101101001011","110110100101","101011001011","110101100101","101101100101","101010011011","110101001101",
"101101001101","101011001101","110101010011","101101010011","110110101001","101011010011","110101101001","101101101001",
"101010110011","110101011001","101101011001","101011011001","110010101011","100110101011","110011010101","100101101011",
"110010110101","100110110101",
"100101011011","110010101101","100110101101","100100100101","100100101001","100101001001","101001001001","100101101101"
};
unsigned int i;
unsigned short cip=0;
unsigned int bar_i=0;
unsigned int datal,k;
unsigned long checksum=0;

datal = strlen((char*)data);
cip = 43;
for(i=0;i<12;i++) bar[bar_i++] = CodeI[cip][i];
bar[bar_i++] = '0';
for(k=0;k<datal;k++){
if(data[k]>=48 &&data[k]<58) cip = data[k]-48;
else if((data[k]>=65)&&(data[k]<92)) cip = data[k]-55;
else if(data[k]==0x2D) cip = 36;
else if(data[k]=='.') cip = 37;
else if(data[k]==' ') cip = 38;
else if(data[k]=='

) cip = 39;
else if(data[k]==0x25) cip= 40;
else if(data[k]=='+') cip = 41;
else if(data[k]==0x2F) cip = 42;
else if(data[k]=='*') cip = 43;
checksum += cip;
for(i=0;i<12;i++) bar[bar_i++] = CodeI[cip][i];
bar[bar_i++] = '0';
}
cip = checksum%43;
for(i=0;i<12;i++) bar[bar_i++] = CodeI[cip][i];
bar[bar_i++] = '0';
cip = 43;
for(i=0;i<12;i++) bar[bar_i++] = CodeI[cip][i];
bar[bar_i++] = 0;
return bar_i;
}

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值