⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 licheng8583.c

📁 8583包接口编程的例子,内有8583包格式说明,对初接触金融行业的程序员很有帮助,绝对原创
💻 C
📖 第 1 页 / 共 2 页
字号:


static short ll[64]=    { 8, 19,  6, 12, 12, 12, 10,  8,
        		  8,  8,  6,  6,  4,  4,  4,  4,
        		  4,  4,  3,  3,  3,  3,  3,  3,
        		  2,  2,  1,  8,  8,  8,  8, 11,
        		 11, 28, 37,104, 12,  6,  2,  3,
        		  8, 15, 40, 25, 76,999,999,999,
        		  3,  3,  3,  8, 16,120,999,999,
        		999,999,999,999,999,999,999,  8}; 

int CFront::UnPack(int iLen)
{
//	ClearPack();   //清空pack包;准备赋值;
    int i, j=0, k;//,iLen = 0;
    char tbuf[1024],bccd[5];
    UCHAR bitmap[9];
	char m_Mac[9];

	memset(bitmap,0x00,sizeof(bitmap));
    memset(bccd,0,sizeof(bccd));
    memset(m_Mac,0,sizeof(m_Mac));
    memset ( m_Mac , 0 , sizeof ( m_Mac ) ) ;


    memset(tbuf,0,sizeof(tbuf));
	memcpy(tbuf,ibuf,4);
	if(memcmp(tbuf,"0400",4)!=0&&memcmp(tbuf,"0410",4)!=0)
		return 1;
	
	strcpy(pack8583.msg,tbuf);
    j += 4;

	memcpy(bitmap , ibuf+4 , 8 ) ;
    j += 8;

    if ( !BitIsTrue(bitmap , 64 ) ) //位元不存在
 	    return 2 ;

    for( k=1; k<65;k++ )
    {
        i=0;
        if( !BitIsTrue(bitmap , k ) )
            continue;
        memset(tbuf,0,sizeof(tbuf));
		memset(bccd,0,sizeof(bccd));
        switch( k )
        {
            case 2: //2位变长
				memcpy( tbuf, ibuf+j, 2);
				i = atoi(tbuf);
				memset(tbuf,0,sizeof(tbuf));
		        memcpy( tbuf, ibuf+j+2, i);
                strcpy( pack8583.a, tbuf );
                i = i+2;
                break;
            case 3:
				memcpy( tbuf, ibuf+j, ll[k-1] );
                strcpy( pack8583.b, tbuf );
                break;
            case 4:
			    memcpy( tbuf, ibuf+j, ll[k-1] );
                strcpy( pack8583.c, tbuf );
                break;
            case 5:
		        memcpy( tbuf, ibuf+j, ll[k-1] );
                strcpy( pack8583.d, tbuf );
                break;
            case 6:
		        memcpy( tbuf, ibuf+j, ll[k-1] );
                strcpy( pack8583.e, tbuf );
                break;
            case 11:
				memcpy( tbuf, ibuf+j, ll[k-1] );
                strcpy( pack8583.f, tbuf );
                break;
            case 12:
			    memcpy( tbuf, ibuf+j, ll[k-1] );
                strcpy( pack8583.g, tbuf );
                break;
            case 13:
		        memcpy( tbuf, ibuf+j, ll[k-1] );
                strcpy( pack8583.h, tbuf );
                break;
            case 14:
		        memcpy( tbuf, ibuf+j, ll[k-1] );
                strcpy( pack8583.i, tbuf );
                break;
            case 15:
				memcpy( tbuf, ibuf+j, ll[k-1] );
                strcpy( pack8583.j, tbuf );
                break;
            case 23:
			    memcpy( tbuf, ibuf+j, ll[k-1] );
                strcpy( pack8583.k, tbuf );
                break;
            case 25:
		        memcpy( tbuf, ibuf+j, ll[k-1] );
                strcpy( pack8583.l, tbuf );
                break;
            case 26:
		        memcpy( tbuf, ibuf+j, ll[k-1] );
                strcpy( pack8583.m, tbuf );
                break;
            case 27:
				memcpy( tbuf, ibuf+j, ll[k-1] );
                strcpy( pack8583.n, tbuf );
                break;
            case 33: //2位变长
				memcpy( tbuf, ibuf+j, 2);
			    i = atoi(tbuf);
		        memset(tbuf,0,sizeof(tbuf));
		        memcpy( tbuf, ibuf+j+2, i);
                strcpy( pack8583.o, tbuf );
                i = i+2;
                break;
            case 34: //2位变长
		        memcpy( tbuf, ibuf+j, 2);
		        i = atoi(tbuf);
			    memset(tbuf,0,sizeof(tbuf));
				memcpy( tbuf, ibuf+j+2, i);
                strcpy( pack8583.p, tbuf );
                i = i+2;
                break;
                
            case 37:
				memcpy( tbuf, ibuf+j, ll[k-1] );
                strcpy( pack8583.q, tbuf );
                break;
            case 39:
				memcpy( tbuf, ibuf+j, ll[k-1] );
                strcpy( pack8583.r, tbuf );
                break;
            case 42:
				memcpy( tbuf, ibuf+j, ll[k-1] );
                strcpy( pack8583.t, tbuf );
                break;
            case 44: //2位变长
				memcpy( tbuf, ibuf+j, 2);
			    i = atoi(tbuf);
		        memset(tbuf,0,sizeof(tbuf));
		        memcpy( tbuf, ibuf+j+2, i);
                strcpy( pack8583.u, tbuf );
                i = i+2;
                break;
            case 48: //3位变长
				memcpy( tbuf, ibuf+j, 3);
			    i = atoi(tbuf);
		        memset(tbuf,0,sizeof(tbuf));
		        memcpy( tbuf, ibuf+j+3, i);
                strcpy( pack8583.v, tbuf );
                i = i+3;
                break;
                
            case 49:
				memcpy( tbuf, ibuf+j, ll[k-1] );
                strcpy( pack8583.w, tbuf );
                break;
            case 52:
				memcpy( tbuf, ibuf+j, ll[k-1] );
                strcpy( pack8583.x, tbuf );
                break;
            case 53:
			    memcpy( tbuf, ibuf+j, ll[k-1] );
                strcpy( pack8583.y, tbuf );
                break;
            case 54: //3位变长
				memcpy( tbuf, ibuf+j, 3);
			    i = atoi(tbuf);
		        memset(tbuf,0,sizeof(tbuf));
		        memcpy( tbuf, ibuf+j+3, i);
                strcpy( pack8583.z, tbuf );
                i = i+3;
                break;
            case 62: //3位变长
			    memcpy( tbuf, ibuf+j, 3);
				i = atoi(tbuf);
		        memset(tbuf,0,sizeof(tbuf));
		        memcpy( tbuf, ibuf+j+3, i);
                strcpy( pack8583.a1, tbuf );
                i = i+3;
                break;
            case 64:
		        memcpy( tbuf, ibuf+j, ll[k-1] );
                strcpy( pack8583.mac, tbuf );
                break;
			default: //有不能识别位元
				return 2 ;
       } 
       if(i==0)
       	  j += ll[k-1];
       else
          j += i;
    }

	return 0;
}



struct PACK8583
{
int  packsize;
char msg[5];    //消息值
char a[ 19+1];        // 
char b[  6+1];       // 
char c[ 12+1];       // 
char d[ 12+1];       // 
char e[ 12+1];       // 
char f[  6+1];      // 
char g[  6+1];     // 
char h[  4+1];     // 
char i[  4+1];     // 
char j[  4+1];     // 
char k[  3+1];      // 
char l[  2+1];      // 
char m[2+1];         // 
char n[  1+1];      // 
char o[ 11+1];      // 
char p[ 28+1];       // 
char q[ 12+1];      // 
char r[  2+1];       // 
char s[ 15+1];        // 
char t[ 25+1];     // 
char u[999+1];       // 
char v[  3+1];       // 
char w[  8+1];       // 
char x[ 16+1];    // 
char y[120+1];    // 
char z[999+1];     // 
char mac[  8+1];        // 
};


/*
    ISO8583包(简称8583包)是一个国际标准的包格式,最多由128个字段域组成,每个域都有统一的规定,并有定长与变长之分。
8583包前面一段为位图,用来确定包的字段域组成情况。  
    其中位图是8583包的灵魂,它是打包解包确定字段域的关键, 而了解每个字段域的属性则是填写数据的基础,  
    1、 位图描述如下:  
        位图位置:1  
        格式:定长  
        类型:B16(二进制16位,16*8=128bit)  
        描述:  
        如将位图的第一位设为'1',表示使用扩展位图(128个域),否则表示只使用基本位图(64个域)。  
        如使用某数据域,应在位图中将相应的位设位'1',如使用41域,需将位图的41位设为'1'。  
        选用条件:如使用65到128域,需设位图域第一位为'1'  
    2、每个域的定义如下:  
       typedef struct ISO8583  
       {  
          int bit_flag;       //域数据类型0 -- string, 1 -- int, 2 -- binary
          char *data_name;    //域名
          int length;         //数据域长度
          int length_in_byte; //实际长度(如果是变长)
          int variable_flag;  //是否变长标志0:否 2:2位变长,3:3位变长
          int datatyp;        //0 -- string, 1 -- int, 2 -- binary
          char *data;         //存放具体值
          int attribute;      //保留
       } ISO8583;  
       ISO8583 Tbl8583[128] =  
       {  
          // FLD 1  
          {0,"BIT MAP,EXTENDED ", 8, 0, 0, 2, NULL,0},  
          // FLD 2  
          {0,"PRIMARY ACCOUNT NUMBER ", 22, 0, 2, 0, NULL,0},  
          // FLD 3  
          {0,"PROCESSING CODE ", 6, 0, 0, 0, NULL,0},  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -