📄 datapackunpackmodule.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 + -