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

📄 iso8583.cpp

📁 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 + -