📄 licheng8583.c
字号:
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 + -