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

📄 datapackunpackmodule.cpp

📁 ISO8583 code pack unpack
💻 CPP
字号:
// dataPackUnpackModule.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include "dataPackUnpackModule.h"

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{
    switch (ul_reason_for_call)
	{
		case DLL_PROCESS_ATTACH:
		case DLL_THREAD_ATTACH:
		case DLL_THREAD_DETACH:
		case DLL_PROCESS_DETACH:
			break;
    }
    return TRUE;
}

////////////////////////////
//FUNCTION 
struct ATM_Data_Property ATMPropertyArray[MAXFIELDNO]={
	{   8, 0, 0,  21, 1},//扩展位图表
	{   5, 0, 0,  38, 1},//服务类型
	{   6, 0, 0,  43, 1},//处理代码
	{   3, 0, 0,  49, 1},//货币类型
	{  12, 0, 0,  52, 1},//交易金额
	{  12, 0, 0,  64, 1},//结算金额
	{  42, 0, 0,  76, 4},//重置金额
	{  20, 0, 0, 118, 3},//设备端原始交易数据
	{   3, 0, 0, 138, 1},//持卡人输入方式
	{   2, 0, 0, 141, 1},//10服务点PIN获取码
	{   8, 8, 0, 143, 1},//个人PIN数据
	{   8, 8, 0, 151, 1},//个人新PIN数据
	{   8, 0, 0, 159, 1},//交费起始日期
	{   8, 0, 0, 167, 1},//交费终止日期
	{   8, 0, 0, 175, 1},//打印起始日期
	{   8, 0, 0, 183, 1},//打印终止日期
	{  21, 0, 0, 191, 1},//客户证件号
	{  10, 0, 0, 212, 1},//客户姓名
	{   4, 0, 0, 222, 1},//卡有效期
	{  19, 0, 1, 226, 1},//20银行主帐号
	{   2, 0, 0, 245, 1},//主帐号的子帐号
	{  19, 0, 1, 247, 1},//银行转入帐号
	{   2, 0, 0, 266, 1},//银行转入帐号的子帐号
	{  37, 0, 1, 268, 1},//二磁道信息
	{ 104, 0, 2, 305, 1},//三磁道信息
	{   8, 0, 0, 409, 1},//交易地日期
	{   6, 0, 0, 417, 1},//交易地时间
	{ 256, 0, 2, 423, 1},//IC卡验证信息
	{   8, 0, 0, 679, 1},//设备编号
	{  11, 0, 0, 687, 1},//30代理地机构编号
	{   8, 0, 0, 698, 1},//设备结帐日期
	{   6, 0, 0, 706, 1},//设备端流水号
	{  11, 0, 1, 712, 1},//前置机机构编号
	{   8, 0, 0, 723, 1},//前置机结帐日期
	{  12, 0, 0, 731, 1},//35前置机流水号
	{   8, 0, 0, 743, 1},//前置机交易日期
	{   6, 0, 0, 751, 1},//前置机交易时间
	{  26, 0, 0, 757, 3},//冲正所需前置机原始交易数据
	{  11, 0, 1, 783, 1},//发卡中心机构编号
	{   8, 0, 0, 794, 1},//40银行主机结帐日期
	{  12, 0, 0, 802, 1},//银行主机流水号
	{   8, 0, 0, 814, 1},//银行主机交易日期
	{   6, 0, 0, 822, 1},//银行主机交易时间
	{  36, 0, 0, 828, 4},//银行帐户余额
	{   6, 0, 0, 864, 1},//授权码
	{  11, 0, 1, 870, 1},//委托单位机构编号
	{   8, 0, 0, 881, 1},//委托单位结帐日期
	{  12, 0, 0, 889, 1},//委托单位流水号
	{   8, 0, 0, 901, 1},//委托单位交易日期
	{   6, 0, 0, 909, 1},//50委托单位交易时间
	{  36, 0, 0, 915, 4},//委托单位余额
	{   1, 0, 0, 951, 1},//委托单位帐号类型
	{  20, 0, 0, 952, 1},//委托单位帐号
	{  58, 0, 0, 972, 3},//文件传输信息
	{  13, 0, 0,1030, 1},//设备服务状态信息
	{  32, 0, 0,1043, 8},//取款钞箱张数
	{  66, 0, 0,1075, 8},//交易统计信息
	{  11, 0, 0,1141, 3},//例外信息
	{1024, 0, 2,1152, 1},//文件块接受缓冲
	{1024, 0, 2,2176, 1},//60附加数据
	{   2, 0, 0,3200, 1},//应答码
	{  16, 8, 0,3202, 2},//数据安全控制信息保密代码
	{   8, 0, 0,3218, 1},//密钥同步计数器
	{   8, 8, 0,3226, 1},//信息授权代码
	{   8, 8, 0,3234, 1},//
	{   1, 2, 0, 0, 1},//
	{   2, 2, 0, 0, 1},//
	{   3, 2, 0, 0, 1},//
	{   3, 2, 0, 0, 1},//
	{   3, 2, 0, 0, 1},//
	{   4, 2, 0, 0, 1},//
	{   4, 2, 0, 0, 1},//
	{   6, 2, 0, 0, 1},//
	{  10, 2, 0, 0, 1},//
	{  10, 2, 0, 0, 1},//
	{  10, 2, 0, 0, 1},//
	{  10, 2, 0, 0, 1},//
	{  10, 2, 0, 0, 1},//
	{  10, 2, 0, 0, 1},//
	{  10, 2, 0, 0, 1},//
	{  10, 2, 0, 0, 1},//
	{  12, 2, 0, 0, 1},//
	{  12, 2, 0, 0, 1},//
	{  12, 2, 0, 0, 1},//
	{  12, 2, 0, 0, 1},//
	{  16, 2, 0, 0, 1},//
	{  16, 2, 0, 0, 1},//
	{  16, 2, 0, 0, 1},//
	{  16, 2, 0, 0, 1},//
	{  42, 2, 0, 0, 0},//
	{   1, 0, 0, 0, 0},//
	{   2, 0, 0, 0, 1},//
	{   5, 0, 0, 0, 1},//
	{   7, 0, 0, 0, 1},//
	{  42, 0, 0, 0, 1},//
	{   8, 8, 0, 0, 1},//
	{  16, 3, 0, 0, 1},//
	{  25, 0, 0, 0, 1},//
	{  11, 2, 1, 0, 1},//
	{  11, 2, 1, 0, 1},//
	{  17, 0, 1, 0, 1},//
	{  28, 0, 1, 0, 1},//
	{  28, 0, 1, 0, 1},//
	{ 100, 0, 2, 0, 1},//
	{ 999, 0, 2, 0, 1},//
	{ 999, 0, 2, 0, 1},//
	{ 999, 0, 2, 0, 1},//
	{ 999, 0, 2, 0, 1},//
	{ 999, 0, 2, 0, 1},//
	{ 999, 0, 2, 0, 1},//
	{ 999, 0, 2, 0, 1},//
	{ 999, 0, 2, 0, 1},//
	{ 999, 0, 2, 0, 1},//
	{ 999, 0, 2, 0, 1},//
	{ 999, 0, 2, 0, 1},//
	{ 999, 0, 2, 0, 1},//
	{ 999, 0, 2, 0, 1},//
	{ 999, 0, 2, 0, 1},//
	{ 999, 0, 2, 0, 1},//
	{ 999, 0, 2, 0, 1},//
	{ 999, 0, 2, 0, 1},//
	{ 999, 0, 2, 0, 1},//
	{ 999, 0, 2, 0, 1},//
	{ 999, 0, 2, 0, 1},//
	{ 999, 0, 2, 0, 1},//
	{ 999, 0, 2, 0, 1},//
	{ 999, 0, 2, 0, 1},//
	{   8, 8, 0, 0, 1} //
	//注意最后一个也要赋初值
};

int ISOToSendStr(unsigned char *dstr,ISO_data *pISO)
{	
	unsigned char *wpt;
	BYTE bitmask,bitmap;
	int k,lc;
	char i,j,n,bitnum;
	/***********************
	检测中心要求:报文=报文头+报文类型标识+位图+报文域(检测指南83页)
	报文头------->报文
	************************/
	memcpy(dstr,pISO->message_id,4);
	for(lc=64,bitnum=8;lc<127;lc++)
		if(pISO->f[lc].bitf)
		{
			bitnum=16;
			break;
		}
	memcpy(dstr+4,pISO->bitmap,bitnum);
	wpt=dstr+4+bitnum;
	for(i=0;i<bitnum;i++){
		bitmap=0;
		bitmask=0x80;
		for(j=0;j<8;j++,bitmask>>=1){
			n=(i<<3)+j;//数据域的序号
			if(pISO->f[n].bitf==0)
			continue;
			bitmap|=bitmask;
			lc=pISO->f[n].len;
			//如果是变长数据,写入变长长度
			if(ATMPropertyArray[n].flag==1){
			(*wpt++)=lc/10+0x30;
			(*wpt++)=lc%10+0x30;
			}
			else if (ATMPropertyArray[n].flag==2){
				(*wpt++)=lc/100+0x30;
		        (*wpt++)=(lc%100)/10+0x30;
		        (*wpt++)=(lc%10)+0x30;
			}
			k=0;
			if(ATMPropertyArray[n].type&0x01){//C or D
				(*wpt++)=pISO->dbuf[pISO->f[n].dbuf_addr+k];
				k++;
				lc++;
			}
			if(ATMPropertyArray[n].type&0x07)
			{
				lc++;
				lc>>=1;
			}
			for(;k<lc;k++)
			{
			(*wpt++)=pISO->dbuf[pISO->f[n].dbuf_addr+k];//C or D
			}
		}
		dstr[i+4]=bitmap;
	}
	if(pISO->f[127].bitf&&bitnum==8)
	{
		dstr[bitnum+3]|=0x01;
		memcpy(wpt,&pISO->dbuf[pISO->f[127].dbuf_addr],8);
		wpt+=8;
	}
	if(bitnum==16)
		dstr[4]|=0x80;
	return wpt-dstr;
}

void ASCToBCD(unsigned char *ascii_buf,unsigned char *bcd_buf,int conv_len)
{
	int    cnt;
	unsigned char   ch,ch1;
	if(conv_len&0x01)
		ch1=0;
	else
		ch1=0x55;
	for(cnt=0;cnt<conv_len;ascii_buf++,cnt++){
		if(*ascii_buf>='a')
			ch=*ascii_buf-'a'+10;
		else if(*ascii_buf>='A')
			ch= *ascii_buf-'A'+10;
		else if(*ascii_buf>='0')
			ch=*ascii_buf-'0';
		else
			ch=0;
		if(ch1==0x55)
			ch1=ch;
		else
		{
			*bcd_buf++=(ch1<<4)|ch;
			ch1=0x55;
		}
	}
	if(ch1!=0x55)
		*bcd_buf=ch1<<4;
	return;
}

int GetVARDataSize(unsigned char *CharArray,int MaxSize)
{	
	for(int i=0; i<MaxSize; i++,CharArray++)
	{
		if(*CharArray=='\0')
			break;
	}
	return i;
}

int ATMToISO(ATM_IFORM *pATM,ISO_data *pISO)
{
	int i,j,k,index=0,bitnum=8,len=0,fno=0;
	BYTE bitmap=0x00,bitmask=0x80;

	memcpy(pISO->message_id,pATM->Message_type_id,4);
	ASCToBCD(pATM->Bit_map,pISO->bitmap,STRSIZE(pATM->Bit_map));

	pISO->off=0;
	//判断有无扩展位图
	if(pISO->bitmap[0]&bitmask){
		bitnum=16;
		ASCToBCD(pATM->Extended_bit_map,pISO->bitmap+8,STRSIZE(pATM->Extended_bit_map));
	}

	for(i=0;i<bitnum;i++)
	{
		bitmask=0x80;
		bitmap=pISO->bitmap[i];
		for(j=0;j<8;j++,bitmask>>=1)
		{
			index=(i<<3)+j;

			if(!(bitmask&bitmap))
			{
				pISO->f[index].bitf=0;
				continue;
			}
			
			if(index==0)//跳过扩展位图
			{
				pISO->f[index].bitf=1;
				pISO->f[index].len=ATMPropertyArray[index].len;
				pISO->f[index].dbuf_addr=-1;//不写入dbuf
				continue;
			}

			pISO->f[index].bitf=1;
			//数据长度处理
			if(ATMPropertyArray[index].flag==1||ATMPropertyArray[index].flag==2)//变长			
			{
				len=GetVARDataSize((unsigned char*)pATM+ATMPropertyArray[index].offset,ATMPropertyArray[index].len);
				pISO->f[index].len=len;
			}
			else
			{
				pISO->f[index].len=ATMPropertyArray[index].len;
			}			
			pISO->f[index].dbuf_addr=pISO->off;//第一个数据域对应的下标为0,扩展位图不写入dbuf		
			pISO->off+=pISO->f[index].len;
			//strcpy(pISO->dbuf+pISO->f[index].dbuf_addr,(char*)pATM+ATMPropertyArray[index].offset);
			for(k=0;k<pISO->f[index].len;k++)
			{
				pISO->dbuf[pISO->f[index].dbuf_addr+k]=*((unsigned char*)pATM+ATMPropertyArray[index].offset+k);
			}
		}
	}
	return 0;
}

int RcvStrToISO(unsigned char *dstr,ISO_data *pISO)
{
	unsigned char  *rpt,bitmask;
	unsigned char  i,j,n,bitnum;
	int            off,len,k;
	//Initialize the pISO->f[].bitf
	for(i=0;i<128;i++)
	pISO->f[i].bitf=0;
	off=0;
	//Get Message ID
    memcpy(pISO->message_id,dstr,4);
	pISO->message_id[4]='\0';
	//Get Bitmap bytes
	if(dstr[4]&0x80)
		bitnum=16;
	else
		bitnum=8;
    memcpy(pISO->bitmap,dstr+4,bitnum);
	//initialize <rpt> point to data elements
	rpt=dstr+4+bitnum;

	//copy dstr elements to pISO
	for(i=0;i<bitnum;i++){
		bitmask=0x80;
		for(j=0;j<8;j++,bitmask>>=1){
			if(i==0&&bitmask==0x80)
				continue;
			if((dstr[i+4]&bitmask)==0)
				continue;
			n=(i<<3)+j;

			//process variable length data elements
			if(ATMPropertyArray[n].flag>0)
			{
				len=(*rpt-0x30)*10 ;
				rpt++;
				len+=*rpt-0x30;
				rpt++;
				if(ATMPropertyArray[n].flag==2){
					len=len*10+(*rpt-0x30);
					rpt++;
				}
				if(len>ATMPropertyArray[n].len){
					return -1;//length error
				}
			}
			else
				len=ATMPropertyArray[n].len;
			pISO->f[n].len=len;
			pISO->f[n].dbuf_addr=off;
			//Credit or Debit Char no include in the len
			if(ATMPropertyArray[n].type&0x01)
				pISO->dbuf[off++]=*rpt++;
			//BCD field Bytes=len/2
			if(ATMPropertyArray[n].type&0x07)
			{
			len++;
			len>>=1;
			}
			//Copy to pISO buffer
//			if(len+off>=500)
//				return(-1);
			for(k=0;k<len;k++)
				pISO->dbuf[off++]=*rpt++;
			pISO->f[n].bitf=1;
		}
	}
	pISO->off=off;
	return 0;
}

void BCDToASC(unsigned char *bcd,unsigned char *asc,int asc_len)
{
   unsigned char is_first;
   unsigned char  by;
   is_first=(asc_len%2);
   while (asc_len-->0)
   {
     if (is_first)
	 {
       by=*bcd&0x0f;
       bcd++;
     }
     else
	 {
		 by=*bcd>>4;
	 }
     by+=(by>=0x0a)?0x37:'0';/*0x37='A'-0x0a*/
     *asc++=by;
     is_first=!is_first;
   }
}

int ISOToATM(ISO_data *pISO,ATM_IFORM *pATM)
{
	int i,j,k,index=0,bitnum=8,len=0,off=0;
	BYTE bitmap=0x00,bitmask=0x80;

	memcpy(pATM->Message_type_id,pISO->message_id,4);
	BCDToASC(pISO->bitmap,pATM->Bit_map,STRSIZE(pATM->Bit_map));
	//判断有无扩展位图
	if(pISO->bitmap[0]&bitmask){
		bitnum=16;		
		BCDToASC(pISO->bitmap+8,pATM->Extended_bit_map,STRSIZE(pATM->Extended_bit_map));
	}
	for(i=0;i<bitnum;i++)
	{
		bitmask=0x80;
		bitmap=pISO->bitmap[i];
		for(j=0;j<8;j++,bitmask>>=1)
		{
			index=(i<<3)+j;
			if(pISO->f[index].bitf==0)//无数据
				continue;			
			if(index==0)//跳过扩展位图
				continue;			
			for(k=0;k<pISO->f[index].len;k++)
				*((unsigned char*)pATM+ATMPropertyArray[index].offset+k)=pISO->dbuf[pISO->f[index].dbuf_addr+k];			
		}
	}
	return 0;	
}
////////////////////////////

// This is an example of an exported function.
DATAPACKUNPACKMODULE_API int PackDatagram(ATM_IFORM *pATM , unsigned char * pStr)
{
	ISO_data ISO;
	memset(&ISO,0,sizeof(ISO));
    ATMToISO(pATM,&ISO);
	return	ISOToSendStr(pStr,&ISO);
}

DATAPACKUNPACKMODULE_API int UnPackDatagram(unsigned char *  pStr,ATM_IFORM *pATM )
{
	ISO_data ISO;
	memset(&ISO,0,sizeof(ISO));
	RcvStrToISO(pStr,&ISO);	
	return ISOToATM(&ISO,pATM);
}


⌨️ 快捷键说明

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