📄 iso8583.cpp
字号:
// Iso8583.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include "iso8583.h"
#include <stdio.h>
FIELDDESC fielddesc128[128]; //128个字段描述
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
//for example: dsp="1A2B3344",count=4,hex={0x1A,0x2B,0x33,0x44};
int WINAPI DSP_2_HEX(unsigned char * dsp,unsigned char * hex,long count)
{
int i;
int sTmpVal;
unsigned char buf[3];
for (i = 0 ; i < count ; i++)
{
memcpy(buf, &dsp[i * 2], 2);
buf[2] = 0;
sscanf((char *)buf, "%02X", &sTmpVal);
hex[i] = (UCHAR) sTmpVal;
}
return count;
}
//for example: hex={0x1A,0x2B,0x33,0x44},count=4,dsp="1A2B3344";
int WINAPI HEX_2_DSP(unsigned char * hex,unsigned char * dsp,long count)
{
char buf[3];
int i;
for(i=0;i<count;i++)
{
sprintf(buf,"%02X",hex[i]);
memcpy(&dsp[i*2],buf,2);
}
dsp[2*count]=0x0;
return 2*count;
}
//如将'34'压缩成0x34 ,其中 chASCLen=2,注意,这里不是标准的转换,不能将字母转换正确
int WINAPI ASCIIToBCD(unsigned char *chASC, int chASCLen, unsigned char *chBCD)
{
int i,Len;
unsigned char chtemp1,chtemp2,*ASCptr,*BCDptr;
ASCptr = chASC;
BCDptr = chBCD;
Len = (chASCLen+1)/2;
for(i=0; i< Len; i++)
{
if(*ASCptr == '=')
chtemp1 = char(0xd0);
else
chtemp1 = *ASCptr << 4;
ASCptr++;
if( 2*i+1 >= chASCLen)
chtemp2 = 0x00;
else
{
if(*ASCptr == '=')
chtemp2 = 0x0d;
else
chtemp2 = *ASCptr-0x30;
ASCptr++;
}
*(BCDptr++) = chtemp1|chtemp2;
}
return Len;
}
//如将0x34解开成'34' ,其中 chBCDLen=1,注意,这里不是标准的转换,不能将字母转换正确
int WINAPI BCDToASCII(unsigned char *chBCD, int chBCDLen, unsigned char *chASC)
{
int i;
unsigned char *BCDptr,*ASCptr;
BCDptr = chBCD;
ASCptr = chASC;
for(i=0; i<chBCDLen; i++)
{
if((*BCDptr & 0xf0) == 0xd0)
*ASCptr = '=';
else
*ASCptr = ((*BCDptr & 0xf0)>>4) + 0x30;
ASCptr++;
if((*BCDptr & 0x0f) == 0x0d)
*ASCptr = '=';
else
*ASCptr = (*BCDptr & 0x0f) + 0x30;
ASCptr++;
BCDptr++;
}
*ASCptr = 0x00;
return 2*chBCDLen;
}
//初始化8583字段描述,fieldnum区分64还是128
void WINAPI Init8583FIELDDESC(FIELDDESC *fielddesc,int fieldnum)
{
memset((void*)&fielddesc128[0],0x00,sizeof(fielddesc128));
for(int index=0;index<fieldnum;index++)
{
fielddesc128[index]=fielddesc[index];
}
}
//把8583包打包成最终格式
int WINAPI PACK8583(DATA8583 *data8583, unsigned char *isobuf)
{
unsigned char *curptr, bitmap[16+1];
unsigned char FieldBuf[2056];
int i, j, len, flag;
char tmp[1024];
char tmp2[5];
int fieldlen=64;
curptr = isobuf; //保存原始指针
len=strlen(data8583->Message_Type_Identifier);
memcpy(curptr,data8583->Message_Type_Identifier,len);
curptr += len;
memset(bitmap,0x00,sizeof(bitmap));
// 打BITMAP----Field 0
memcpy( curptr, &data8583->Primary_Bitmap[0], 8 );
memcpy( bitmap, &data8583->Primary_Bitmap[0], 8 );
curptr += 8;
if((bitmap[0] & 0x80)==0x80) //有扩展位图
{
memcpy( curptr, &data8583->Primary_Bitmap[8], 8 );
curptr+=8;
memcpy(&bitmap[8], &data8583->Primary_Bitmap[8], 8 );
fieldlen=128;
}
// 打2至64 or 128各个域
for( i=2; i<=fieldlen; i++ )
{
flag = bitmap[(i-1)/8]&( 0x80>>( (i-1)%8 ) );
if( flag==0 ) continue;
for( j=0;; j++ )
{
if( fielddesc128[j].fieldid==i ) break;
else if( fielddesc128[j].fieldid==255 ) return( 0 );
}
memset(FieldBuf,0x00,sizeof(FieldBuf));
GetOrSetFieldBuf(data8583,i,(char*)FieldBuf,0,1); //获取
if( fielddesc128[j].fieldattr & LLVAR )
{
len = strlen((char*)FieldBuf);
if (len >fielddesc128[j].fieldlen) len = fielddesc128[j].fieldlen;
sprintf(tmp,"%02d",len);
memset(tmp2,0x00,sizeof(tmp2));
DSP_2_HEX((unsigned char*)tmp,(unsigned char*)tmp2,1),
memcpy(curptr,tmp2,1);
curptr+=1;
if( fielddesc128[j].fieldattr & BCD )
{
memset(tmp,0x00,sizeof(tmp));
len = DSP_2_HEX(FieldBuf,(unsigned char*)tmp,len);
memcpy(curptr,tmp,len);
}
else
memcpy(curptr,FieldBuf,len);
}
else if( fielddesc128[j].fieldattr & LLLVAR )
{
len = strlen((char*)FieldBuf);
if (len >fielddesc128[j].fieldlen) len = fielddesc128[j].fieldlen;
sprintf(tmp,"%04d",len);
memset(tmp2,0x00,sizeof(tmp2));
DSP_2_HEX((unsigned char*)tmp,(unsigned char*)tmp2,2);
memcpy(curptr,tmp2,2);
curptr += 2;
if( fielddesc128[j].fieldattr & BCD )
{
len = DSP_2_HEX(FieldBuf,(unsigned char*)tmp,len);
memcpy(curptr,tmp,len);
}
else
memcpy(curptr,FieldBuf,len);
}
else
{
len = fielddesc128[j].fieldlen;
if( fielddesc128[j].fieldattr & BCD )
{
len = DSP_2_HEX(FieldBuf,(unsigned char*)tmp,len);
memcpy(curptr,tmp,len);
}
else
{
/*if (i == 64)
{
k = curptr - isobuf;
//PinKey->GetMAC1(16,isobuf,chMac,k);
//memcpy(data8583->MAC_Code,chMac,8);
//memcpy(curptr, chMac, len );
}
else*/
memcpy( curptr, FieldBuf, len );
}
}
curptr += len;
}
len = curptr - isobuf;
return len;
}
//把最终格式解开成8583格式
int WINAPI UNPACK8583(unsigned char *isobuf,DATA8583 *data8583)
{
unsigned char *curptr, bitmap[16+1];
char *FieldBuf,chASC[1003];
char chtemp1,chtemp2;
int i, j, k, len, flag,len1,Keyflag=0;
int fieldlen=64;
curptr = isobuf;
memset(data8583, 0, sizeof(DATA8583));
memset(bitmap,0x00,sizeof(bitmap));
// 解Message Type Identifier----Field -1
len = 4;
memcpy(data8583->Message_Type_Identifier,curptr,len);
curptr += 4;
// 解Primary BITMAP----Field 0
memcpy(data8583->Primary_Bitmap, curptr, 8 );
memcpy(bitmap, curptr, 8 );
curptr += 8;
if((bitmap[0] & 0x80)==0x80) //有扩展位图
{
memcpy(&data8583->Primary_Bitmap[8],curptr, 8 );
memcpy(&bitmap[8], curptr, 8 );
curptr+=8;
fieldlen=128;
}
// 根据BITMAP解2至64各个域
for( i=2; i<=fieldlen; i++ )
{
flag = bitmap[(i-1)/8]&( 0x80>>( (i-1)%8 ) );
if( flag==0 ) continue;
for( j=0;; j++ )
{
if( fielddesc128[j].fieldid==i ) break;
else if( fielddesc128[j].fieldid==255 ) return( 0 );
}
FieldBuf=NULL; //所有的都先清零0
GetOrSetFieldBuf(data8583,i,FieldBuf,0,1);
if( fielddesc128[j].fieldattr & LLVAR )
{
chtemp1 = *curptr;
len = ((chtemp1 >> 4)*10) + (chtemp1 & 0x0f);
if (len >fielddesc128[j].fieldlen)
len1 = fielddesc128[j].fieldlen;
else
len1 = len;
curptr ++;
if( fielddesc128[j].fieldattr & BCD )
{
k = (len+1)/2;
HEX_2_DSP((unsigned char *)curptr,(unsigned char *)chASC,k);
memcpy(FieldBuf,chASC,len1);
}
else
{
k = len;
memcpy(FieldBuf,curptr,len1);
}
}
else if( fielddesc128[j].fieldattr & LLLVAR )
{
chtemp1 = *curptr;
chtemp2 = *(curptr+1);
len = (((chtemp1 & 0x0f)*10) + (chtemp2 >>4))*10 + (chtemp2 &0x0f);
if (len >fielddesc128[j].fieldlen)
len1 = fielddesc128[j].fieldlen;
else
len1 = len;
curptr +=2;
if( fielddesc128[j].fieldattr & BCD )
{
k = (len+1)/2;
HEX_2_DSP((unsigned char *)curptr,(unsigned char *)chASC,k);
memcpy(FieldBuf,chASC,len1);
}
else
{
k = len;
memcpy(FieldBuf,curptr,len1);
}
}
else
{
len = fielddesc128[j].fieldlen;
if( fielddesc128[j].fieldattr & BCD )
{
k = (len+1)/2;
HEX_2_DSP((unsigned char *)curptr,(unsigned char *)chASC,k);
memcpy(FieldBuf,chASC,len);
}
else
{
k = len;
memcpy(FieldBuf,curptr,len);
}
}
curptr += k;
}
return( 0 );
}
//设置或者获取8583格式中fieldid中的值,optype==0表示设置,1表示获取
int WINAPI GetOrSetFieldBuf(DATA8583 *data8583,int FieldID,char *FieldBuf,int fieldbuflen,int optype)
{
if(optype==0) //设置
{
if(FieldID==0)
{
strncpy(data8583->Message_Type_Identifier,FieldBuf,strlen(FieldBuf));
}
else if(FieldID==1)
{
if(fieldbuflen==0)
{
memcpy(data8583->Primary_Bitmap,FieldBuf,strlen(FieldBuf));
}
else
{
memcpy(data8583->Primary_Bitmap,FieldBuf,fieldbuflen);
}
}
else
{
if(FieldID>128) return 0;
memset(data8583->FieldDataStr[FieldID-2].datas,0x00,sizeof(data8583->FieldDataStr[FieldID-2].datas));
if(fieldbuflen==0)
{
memcpy(data8583->FieldDataStr[FieldID-2].datas,FieldBuf,strlen(FieldBuf));
data8583->FieldDataStr[FieldID-2].datalen=strlen(FieldBuf);
}
else
{
memcpy(data8583->FieldDataStr[FieldID-2].datas,FieldBuf,fieldbuflen);
data8583->FieldDataStr[FieldID-2].datalen=fieldbuflen;
}
data8583->FieldDataStr[FieldID-2].datas[data8583->FieldDataStr[FieldID-2].datalen]=0x00;
}
}
else //获取
{
if(FieldID==0)
{
if(FieldBuf==NULL)
{
FieldBuf=data8583->Message_Type_Identifier;
}
else memcpy(FieldBuf,data8583->Message_Type_Identifier,strlen(data8583->Message_Type_Identifier));
}
else if(FieldID==1)
{
if(FieldBuf==NULL)
{
FieldBuf=(char*)data8583->Primary_Bitmap;
}
else
{
if(fieldbuflen==0)
{
memcpy(FieldBuf,data8583->Primary_Bitmap,16);
}
else
{
memcpy(FieldBuf,data8583->Primary_Bitmap,fieldbuflen);
}
}
}
else
{
if(FieldID>128) return 0;
if(FieldBuf==NULL)
{
FieldBuf=data8583->FieldDataStr[FieldID-2].datas;
}
else memcpy(FieldBuf,data8583->FieldDataStr[FieldID-2].datas,data8583->FieldDataStr[FieldID-2].datalen);
}
}
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -