条码解析

来源:互联网 发布:冰雅蝶雪恋 知乎 编辑:程序博客网 时间:2024/05/20 03:42

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;
}

 


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 lv迷你水桶包肩带长了怎么办 在香港买个lv包包过海关怎么办 国际快递手表被海关查应该怎么办 把档案放到人才市场后报到证怎么办 皮表带带久了有异味怎么办 英语中用词不当和拼写错误怎么办 爬楼梯的购物车车轮坏了怎么办? 帮别人买东西不给我钱怎么办 老师念错名字有同学指出来你怎么办 老公婚前买的房子婆婆想霸占怎么办 我想查我的基金收益情况怎么办 儿童票买好了但大人退票了怎么办 没有享受到国家政策的农民怎么办? 股票涨了没抛然后一直跌怎么办 苹果手机放久了开不了机怎么办 部门要辞退你你不想走该怎么办 口头说辞职现在又不想走了怎么办 网上买的理财不给退本金怎么办 买东西遇到态度不好的人你会怎么办 app在下载东西时被停用了怎么办 买东西填错地址 但已签收怎么办 网购手机受骗后电话打不通怎么办 淘宝买的东西发错了怎么办 淘宝上买的东西发错了怎么办 淘宝上买的东西发多了怎么办 淘宝上买的东西出现问题怎么办 淘宝买东西未收到货显示签收怎么办 网上一张车票两人同时付款了怎么办 微信付款时显示银行卡被锁定怎么办 微信忘记支付密码怎么办没有银行卡 支付宝赏金扫码支付不行怎么办 网购收货时发现货物已破损怎么办 货物丢失了不承认调查出来了怎么办 小米商城已签收未收到了怎么办 网购的一只荷兰猪现在怎么办 中通快递的掌中通好评怎么办 唯品会快递被签收却没收到货怎么办 拼多多快递签收了但没收到货怎么办 顺丰代收签收成功要强制退款怎么办 淘宝付了钱如果商家没货了怎么办 别人拿走我的货不给钱怎么办