Эх сурвалжийг харах

#IQRV #comment [Other] 添加CMBPrint的源码工程

gifur 3 жил өмнө
parent
commit
5b797b78b4

+ 1 - 0
Other/CMakeLists.txt

@@ -18,6 +18,7 @@ add_subdirectory(libfacecapture)
 add_subdirectory(libaudions)
 add_subdirectory(libaudiotransqueue)
 add_subdirectory(libwmvrecord)
+add_subdirectory(libCMBPrint)
 
 if(MSVC)
    add_subdirectory(libimgplayer)

+ 825 - 0
Other/libCMBPrint/CARD-v4.HPP

@@ -0,0 +1,825 @@
+#ifndef CARD_HPP
+#define CARD_HPP
+
+//////////////////////////////////////////////////////////////////////////////
+//	MODULE:		Y-PR50.HPP
+//	PORPUSE:	Print Sub Class
+//			low level print control
+//			margetic read and write
+//			password keyboard input
+//	DEVELOP TOOL:	BOLAND C++ V3.1
+//			ZINC C++ V3.5
+//	AUTHOR:		HUANG-ZHEN
+//			WEI-JIANGBO
+//     	DATE:		1995.1.8
+//	VERSION:	Version 3.0
+//
+//
+
+//hz, modified on 95.1.19
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef linux
+typedef int BOOL;
+#define TRUE 1
+#define FALSE 0
+#else
+//#include <bios.h>
+#include <dos.h>
+#include <conio.h>
+#include <string.h>
+#include <windows.h>
+#endif //linux
+
+#define  	BAUD		0xe0        /* Baud 9600 */
+#define         BAUD_RATE       9600
+
+
+#define  ShowLogo     57
+#define  RS_INIT      0x00
+#define  RS_XMT       0x01
+#define  RS_RCV       0x02
+#define  RS_STATUS    0x03
+
+#define esc 0x1b
+#define true 1
+#define false 0
+
+#define 	TIM_OUT_BIT	0x8000
+#define 	XMT_RDV_BIT 0x2000
+#define		BRK_DET_BIT	0x1000
+#define		FRM_ERR_BIT 0x0800
+#define     	PAR_ERR_BIT	0x0400
+#define		OVR_RUN_BIT	0x0200
+
+#define  	RCV_ERR_BIT	0x8e00
+
+//hz, #define  	BAUD		0xe0        /* Baud 9600 */
+#define 	PARA        	0x00        /* Para None */
+#define		STOP		0x00        /* Stop 1    */
+#define		DATA	 	0x03        /* Data  8   */
+
+#define         COM1            1 //hz, 0           /* COM1 port */
+#define         PORT_ERR        1
+#define         PORT_OK         0
+
+#define BUFSIZE       1024
+#define CLR_BIM     "\033\062"
+#define SET_BIM     "\033\061"
+#define LINE_BUFSIZ     640       //hz, change 240, now, can write 40 chinese word
+
+#define true            1
+#define false           0
+
+#define YES             1
+#define NO              0
+
+#define OK              1
+#define ERR             0
+#define ABORT           -1
+
+#define NOTHING         0
+#define PUBLIC
+#define LOCAL           static
+
+#define CME_USER_BREAK   2
+#define CM_FORMAT_ERR    3
+
+#define CM_LEN_TRACK1  110
+#define CM_LEN_TRACK2  40
+#define CM_LEN_TRACK3  110
+#define CM_LEN_BUFF    (CM_LEN_TRACK1+CM_LEN_TRACK2+CM_LEN_TRACK3+50)
+
+#define PORT_COM1      0x03F8   /* COM 1 */
+#define PORT_COM2      0x02F8   // COM 2
+#define PORT_DATA		0   /* DATA */
+#define PORT_IER		1	/* Interrupt enable register */
+#define PORT_IIR		2	/* Interrupt info. register */
+#define PORT_LCR		3	/* Line control register  */
+#define PORT_MCR		4	/* Modem control register */
+#define PORT_LSR		5	/* Line status register */
+#define PORT_MSR		6	/* Modem status register */
+
+typedef struct
+{
+   	char track1[CM_LEN_TRACK1];
+   	char track2[CM_LEN_TRACK2];
+   	char track3[CM_LEN_TRACK3];
+}  TCMtrackdata;
+
+
+//typedef char   	        BYTE;
+//typedef unsigned int          WORD;
+typedef int             PR50_BOOLEAN;
+
+struct CHIN_font
+{
+	 char upper_half[16];
+	 char lower_half[16];
+};
+
+
+#pragma warning(disable:4786)
+#include <string>
+#include <map>
+#include <fstream>
+
+using namespace std;
+
+typedef struct SIGN_CARD_DATA   //hz, 97.01.30
+{
+	char  pan[18];             // left
+	//char  merchant[8];
+	//char  cardType;            // 1.sign card  2.save card  3...
+	//char  moneyCode[2];        // 10
+	//char  amount[5];
+	char  exprDate[4];
+	char  cvc1[3];
+	//char  cvc2[15];
+	//char  reserved[10];
+	char stringEnd;
+} sign_card_data;
+
+typedef struct SIGN_CARD_TRACK2 //hz, 97.01.30
+{
+	//char  stx;                 // ;
+	char  pan[18];
+	char  fs;                  // =
+	char  exprDate[4];
+	char  cardType[3];         // 530
+	char  cvc[11];
+	//char  etx;                 // ?
+	char stringEnd;
+} sign_card_track2;
+
+typedef struct SIGN_CARD_TRACK3 //hz, 97.01.30
+{
+	//char  stx;                 // !
+	char  formate[2];          // 01
+	char  pan[18];
+	char  fs1;                 // =
+	char  country[3];          // 156
+	char  moneyCode[3];        // 156
+	char  point;               // 0
+	char  auth[4];             // 5000
+	char  remSum[4];           // 5000
+	char  rsDate[4];           // 0000
+	char  rLength[2];          // 01
+	char  retry;               // 3
+	char  pinOffset[6];        // 000000
+	char  cardType[3];         // 530
+	char  TA_SR1[2];           // 00
+	char  TA_SR2[2];           // 00
+	char  exprDate[4];
+	char  fix[10];             // 1000000000
+	char  san1[12];            // 000000000000
+	char  fs2;                 // =
+	char  san2[12];            // 000000000000
+	char  fs3;                 // =
+	char  tFlag;               // 0
+	char  cvc[6];
+	char  sFlag;               // 0
+	//char  etx;                 // ?
+	char stringEnd;
+} sign_card_track3;
+
+typedef struct CREDIT_CARD_TRACK2
+{
+	//char start;
+	char masterAccount[16];
+	char separator1;		// = '\'';
+	char expirationDate[4];
+	char serviceCode[3];
+	char discretionaryData[11];
+	//char end;
+	char stringEnd;
+} credit_card_track2;
+
+typedef struct NEW_CREDIT_TRACK2
+{
+	//char start;
+	char masterAccount[16];
+	char separator1;		// = '\'';
+	char otherData[15];
+	//char end;
+	char stringEnd;
+} new_credit_track2;
+
+typedef struct SZ_TRACK2
+{
+	//char start;
+	char masterAccount[15];
+	char separator1;		// = '\'';
+	char constant[10]; 		//= "1560000514"
+	char cardType;
+	char area[8];
+	//char end;
+	char stringEnd;
+} sz_track_2;
+
+typedef struct TRACK2
+{
+	//char start;
+	char masterAccount[15+3];
+	char separator1;		// = '\'';
+	char constant[10]; 		//= "1560000514"
+	char cardType;
+	char area[7];
+	//char end;
+	char stringEnd;
+} track_2;
+
+
+typedef struct TRACK3
+{
+	char formatCode[2];    	// = { '0', '1'};
+	char masterAccount[15+3];
+	char separator1;		// = '\'';
+	char constant1_0[22];
+	char controlPara[6];
+	char constant1_1[12];
+	char separator2;
+	char slave1[11];
+	char separator3;
+	char slave2[9];
+	char separator4;
+	char constant2[7];
+	char cardType;
+	char area[8];
+	char stringEnd;
+} track_3;
+
+typedef struct SZ_TRACK3
+{
+	char formatCode[2];    	// = { '0', '1'};
+	char masterAccount[15];       //hz, 96.05.28
+	char separator1;		// = '\'';
+	char constant1_0[22];
+	char controlPara[6];
+	char constant1_1[12];
+	char separator2;
+	char slave1[11];
+	char separator3;
+	char slave2[9];
+	char separator4;
+	char constant2[7];
+	char cardType;
+	char area[8];
+	char stringEnd;
+} sz_track_3;
+
+typedef struct INTERNET_TRACK2
+{
+	//char start;
+	char PAN[16];
+	char separator1[1];		// = '\'';
+	char expirationDate[4]; 		//
+        char serviceCode[3];
+	char CVV[3];
+	//char end;
+	char stringEnd;
+} internet_track_2;
+
+typedef struct INTERNET_TRACK3
+{
+	char formatCode[2];    	// = { '0', '1'};
+	char PAN[16];
+	char separator1[1];		// = '\'';
+	char countryCode[3];
+        char currency[3];
+        char currencyExponent[1];
+        char amountAuthorized[4];
+        char amountRemaining[4];
+        char cycleBegin[4];
+        char cycleLength[2];
+	char retryCount[1];
+        char PINPARM[6];
+        char interchangeControl[1];
+        char serviceRestriction[2];
+        char SRofSAN1[2];
+        char SRofSAN2[2];
+        char expiryDate[4];
+        char sequenceNo[1];
+        char securityNo[1];
+        char SAN1[12];
+        char separator2[1];
+        char SAN2[12];
+        char separator3[1];
+        char relayMarker[1];
+        char CCD[6];
+        char transactionDate[1];
+        char AVV[1];
+        char INNIC[3];
+        char CVV[3];
+	char stringEnd;
+} internet_track_3;
+
+/*
+typedef struct NEW_TRACK0
+{
+	char masterAccount[16];
+	char cardSerial;
+	char SVCD[6];
+	char oldRGCD[4];
+	char oldCUNO[8]; 
+	char oldPSBK[8];
+	char stringEnd;
+} new_track_0;
+*/
+
+typedef struct NEW_TRACK0
+{
+	char masterAccount[16];
+	char cardSerial;
+	char SVCD[6];
+	char oldRGCD[4];
+	char expireDate[4];
+	char stringEnd;
+} new_track_0;
+
+typedef struct IC_TRACK0
+{
+	char masterAccount[19];
+	char cardSerial;
+	char SVCD[6];
+	char oldRGCD[4];
+	char expireDate[4];
+	char stringEnd;
+} ic_track_0;
+
+typedef struct NEW_TRACK2   //9555银联卡
+{
+//	char start;             // ;
+	char masterAccount[16];
+	char separator1;		// '
+	char expireDate[4];     // * 9912->4912
+	char serviceCode[3];    // 220->120
+	char appendData[13];    // SVCD(6) +卡顺号(1) +CVC(3)+'000'
+//	char endFlag;           // ?
+//  char LRC;
+	char stringEnd;
+} new_track_2;
+
+typedef struct NEW1_TRACK2	// 6字头银联卡
+{
+//	char start;             // ;
+	char masterAccount[16]; //*
+	char separator1;		// '
+	char expireDate[4];     // * 9912->4912
+	char serviceCode[3];    // 101->120
+	char localCheckMessage[5];	//	12345	PVKI(1) + PVV(4)
+	char appendData[8];    //*	随机数(2)+ CVV(3) + 随机数(3)
+//	char endFlag;           // ?
+//  char LRC;
+	char stringEnd;
+} new1_track_2;
+
+typedef struct IC_TRACK2	// 6字头IC卡, zhanglei, 2010.09.19
+{
+//	char start;             // ;
+	char masterAccount[19]; //* 帐号长度与NEW1_TRACK2不同,localCheckMessage和appendData调整
+	char separator1;		// '
+	char expireDate[4];     // * 9912->4912
+	char serviceCode[3];    // 101->120
+	char localCheckMessage[3];	//	12345	PVKI(1) + PVV(4)
+	char appendData[7];    //*	随机数(2)+ CVV(3) + 随机数(3)
+//	char endFlag;           // ?
+//  char LRC;
+	char stringEnd;
+} ic_track_2;
+
+typedef struct HK_TRACK0	//Lint	香港两地通	2003-1-6 16:16
+{
+	char masterAccount[16];
+	char cardSerial;
+	char SVCD[6];
+	char oldRGCD[4];
+	char expireDate[4];
+	char language;
+    char PIN;					//*	PIN校验位
+    char PINOffset[5];			//*	PIN偏移量
+	char stringEnd;
+} hk_track_0;
+
+typedef struct HK_TRACK2	//Lint	香港一卡通	2002-11-25 16:53
+{
+//	char start;             // ;
+	char masterAccount[16]; //*
+	char separator1;		// '
+	char expireDate[4];     // *
+	char serviceCode[3];    // 101
+	char localCheckMessage[5];	//	12345	PVKI(1) + PVV(4)
+	char appendData[8];    //*	随机数(2)+ CVV(3) + 随机数(3)
+//	char endFlag;           // ?
+//  char LRC;
+	char stringEnd;
+} hk_track_2;
+//extern const char defHKTrack2[];	//香港一卡通	2002-11-25 17:03
+//extern const char defNewTrack2[];
+
+typedef struct NEW_TRACK3
+{
+//	char start;             // ;
+	char formatCode[2];     // 99
+	char masterAccount[16]; 
+	char separator1;		// '
+	char countryCode[3];    // 156
+	char currencyCode[3];   // 156
+	char moneyExp;          // 0
+	char periodAccredit[4];   // 5000
+	char periodBalance[4];    // 5000
+	char periodStartDate[4];  // 0000->0001
+    char periodLength[2];     // 01
+	char passwordRetry;       // 5
+	char SVCD[6];        
+	char exchangeCode;        // 2
+	char PANTASR[2];          // 14
+	char SAN1TASR[2];         // 00
+	char SAN2TASR[2];         // 00
+	char expireDate[4];       // * 9912->4912
+	char cardSerial;
+	char separator2;		// '
+    char SAN1[10];          // (新)内部客户号:分行(3)+客户号(6)+校验(1)
+	char separator3;		// '
+    char SAN2[9];           // * 卡凭证号(8)+校验(1) 
+	char separator4;		// '
+    char transferFlag;      // 0
+	char checkNum[6];       // 加密校验数
+	char appendData[16];    // * (旧)分行号(4)+客户号(8)+校验(1)+'000'
+//	char endFlag;           // ?
+//  char LRC;
+	char stringEnd;
+} new_track_3;
+
+
+typedef struct IC_TRACK3    // 6字头IC卡, zhanglei, 2010.09.19
+{
+//	char start;             // ;
+	char formatCode[2];     // 99
+	char masterAccount[19]; //* 帐号长度与NEW1_TRACK3不同
+	char separator1;		// '
+	char countryCode[3];    // 156
+	char currencyCode[3];   // 156
+	char moneyExp;          // 0
+	char periodAccredit[4];   // 5000
+	char periodBalance[4];    // 5000
+	char periodStartDate[4];  // 0000->0001
+    char periodLength[2];     // 01
+	char passwordRetry;       // 5
+	char SVCD[6];        
+	char exchangeCode;        // 2
+	char PANTASR[2];          // 14
+	char SAN1TASR[2];         // 00
+	char SAN2TASR[2];         // 00
+	char expireDate[4];       // * 9912->4912
+	char cardSerial;
+	char separator2;		// '
+    char SAN1[10];          // (新)内部客户号:分行(3)+客户号(6)+校验(1)
+	char separator3;		// '
+    char SAN2[9];           // * 卡凭证号(8)+校验(1) 
+	char separator4;		// '
+    char transferFlag;      // 0
+	char checkNum[6];       // 加密校验数
+	char appendData[13];    // * (旧)分行号(4)+客户号(8)+校验(1)+'000'
+//	char endFlag;           // ?
+//  char LRC;
+	char stringEnd;
+} ic_track_3;
+
+typedef struct HK_TRACK3	//	香港一卡通3磁道格式包
+{
+//	char start;             // ;
+	char formatCode[2];     //	92
+	char cardType[2];		//	40	卡类别
+	char bankSign[4];			//	2658	发卡行标识
+	char masterAccount[12];	//*		右10位主账号+00
+	char separator1;		//	'
+	char separator2;		//	'
+	char currencyCode[3];   //	000	货币代码
+	char currencyIndex;		//	0	货币指数
+	//char countryCode[3];	//	156
+	char VISAGrantDegree[2];	//	00	VISA账户周期授权额度
+	char grantDegree[2];	//	00	本行账户周期授权额度
+	char transferrableBalance[4];	//0000	VISA当前周期内可提款或转账的余额
+	char secondBankSign[4];	//0000	第二发卡行标示
+	//char moneyExp;          // 0
+	//char periodAccredit[4];   // 5000
+	//char periodBalance[4];    // 5000
+	//char periodStartDate[4];  // 0000
+    char periodLength[2];     // 00	周期长度,ATM忽略
+    char passwordRetry;       // 4	密码重试次数
+    char PIN;					//*	PIN校验位
+    char PINOffset[5];			//*	PIN偏移量
+//	char checkNum[6];			//	校验和
+    char exchangeCode;        // 0	交换控制符
+    char masterAccountType;		//1	主账户类型	1 - 储蓄帐户2 - 支票账户3 - 信用卡或联名卡账户4 - 员工账户5 - 无存折储蓄帐户6 - 保留
+	char masterAccountLimit;	//0	主账户限制码	0 - 无限制1 - 禁止扣帐(允许存款、转入)2 - 禁止存入(允许提款、转出)
+	char firstSubsidiaryAccountType;	//	0	第一辅助账户类型	0 - 不存在编码;其他同masterAccountType
+	char firstSubsidiaryAccountLimit;	//	0	第一辅助账户限制码
+	char secondSubsidiaryAccountMessage[2];	//00	第二辅助账户及限制码
+	char expireDate[4];       //*	失效日期
+	char cardSerial[2];		//*	卡顺序号
+	//char firstSubsidiaryAccount[12];	//000000000000	第一辅助账号
+	//char secondSubsidiaryAccount[12];	//000000000000	第二辅助账号
+	char appendData[24];				//*	附加数据	"YYYYMMDD"(申请日期)+随机数(7)+CVV(3)+随机数(6)
+	char lastTranDate[4];				//	0000	上次交易日期
+	char lastTranTime[4];				//	0000	上次交易时间
+	char lastVISADate[4];				//	0000	上次VISA交易日期
+	char lastVISATime[4];				//	0000	上次VISA交易时间
+	char currentTransferrableBalance[3];	//	000	本行账户当前周期内可提款或转账的余额
+	char language;						//* 	语言代码	1-中文	2-英文
+	
+	//	char endFlag;           // ?
+	//  char LRC;
+	char stringEnd;
+} hk_track_3;
+
+typedef struct INTER_TRACK0	//Lint	国际借记卡	2003-1-6 16:16
+{
+	char masterAccount[16];
+	char cardSerial;
+	char SVCD[6];
+	char oldRGCD[4];
+	char expireDate[4];
+	char stringEnd;
+} inter_track_0;
+
+typedef struct INTER_TRACK2	//Lint	国际借记卡2磁道	2004-2-13 15:22
+{
+//	char start;             // ;
+	char masterAccount[16]; //*
+	char separator1;		// '
+	char expireDate[4];     // *
+	char serviceCode[3];    // 101
+	char localCheckMessage[5];	//	12345	PVKI(1) + PVV(4)
+	char appendData[8];    //*	随机数(2)+ CVV(3) + 随机数(3)
+//	char endFlag;           // ?
+//  char LRC;
+	char stringEnd;
+} inter_track_2;
+
+typedef struct INTER_TRACK3	//	国际借记卡3磁道格式包
+{
+//	char start;             // ;
+	char formatCode[2];     //	99
+	char cardType[2];		//	41	卡类别
+	char bankSign[4];			//	0062	发卡行标识
+	char masterAccount[10];	//*		右10位主账号
+	char separator1;		//	'
+	char nationCode[3];   //	156	国家代码
+	char currencyCode[3];   //	156	货币代码
+	char currencyIndex;		//	0	货币指数
+	char periodAccredit[4];   //	5000	周期授予量
+	char periodBalance[4];    //5000	当前周期内可提款或转账的余额
+	char periodStartDate[4];  //0000	周期开始日期
+	char periodLength[2];     // 01	周期长度,ATM忽略
+	char passwordRetry;       // 5	密码重试次数
+	//char PIN;					//*	PIN校验位
+    //char PINOffset[5];			//*	PIN偏移量
+    char grantControlCode[6];	//CVV(3)+随机数(3)
+	char exchangeCode;        // 2	交换控制符
+	char masterAccountType;		//1	主账户类型	1 - 储蓄帐户2 - 支票账户3 - 信用卡或联名卡账户4 - 员工账户5 - 无存折储蓄帐户6 - 保留
+	char masterAccountLimit;	//4	主账户限制码	0 - 无限制1 - 禁止扣帐(允许存款、转入)2 - 禁止存入(允许提款、转出)
+	char firstSubsidiaryAccountType[2];		//	00	第一辅助账户类型	0 - 不存在编码;其他同masterAccountType
+	char firstSubsidiaryAccountLimit[2];	//	00	第一辅助账户限制码
+	char expireDate[4];       //*	失效日期
+	char cardSerial;		//*	卡顺序号
+	char encryptCode;		//'	卡保密号	缺省为分隔符
+	char firstSubsidiaryAccount[10];	//000000000000	第一辅助账号 分行(3)+客户号(6)+校验(1)
+	char separator2;		//	'
+	char secondSubsidiaryAccount[9];	//000000000000	第二辅助账号 卡凭证号(8)+校验(1)
+	char separator3;		//	'
+	char passingCode;		// 0
+	char checkNum[6];			//	校验和
+	char appendData[16];				//*	附加数据	分行号(4)+客户号(8)+校验(1)+"000"
+  
+    //	char endFlag;           // ?
+	//  char LRC;
+	char stringEnd;
+} inter_track_3;
+
+
+typedef struct NWPK_TRACK0	// 新系统存折 
+{
+	char masterAccount[15];
+	char PSBNBR[10];
+	char SVCD[6];
+	char stringEnd;
+} nwpk_track_0;
+
+
+typedef struct NWPK_TRACK2	// 新系统存折 
+{
+//	char start;             // ;
+	char masterAccount[15]; // *
+	char separator1;		// '
+	char PSBNBR[10];        // *
+	char SVCD[6];           // *
+	char AccountChk;        // * 
+//	char endFlag;           // ?
+//  char LRC;
+	char stringEnd;
+} nwpk_track_2;
+
+typedef struct NWPK_TRACK3  // 新系统存折 
+{
+//	char start;             // ;
+	char formatCode[2];     // 60
+	char masterAccount[15]; // *
+	char separator1;		// '
+	char countryCode[3];    // 156
+	char currencyCode[3];   // 156
+	char passwordRetry;     // 5
+	char AccountChk;        // * 
+	char LENSTR[10];        // 0015100699
+	char separator2;		// '
+	char PSBNBR[10];        // * 
+    char PSBCHK;            // * 
+	char separator3;		// '
+	char SVCD[6];           // *
+	char CVCCHK;            // *
+	char separator4;		// '
+	char checkNum[6];       // 000000
+	char appendData[16];    // 8130379181303791
+//	char endFlag;           // ?
+//  char LRC;
+	char stringEnd;
+} nwpk_track_3;
+
+
+typedef struct NWUS_TRACK0	// 新系统用户卡 
+{
+	char USRNBR[6];
+	char cardSerial;
+	char SVCD[6];
+	char stringEnd;
+} nwus_track_0;
+
+
+typedef struct NWUS_TRACK2	// 新系统用户卡 
+{
+//	char start;             // ;
+	char USRNBR[6];         // *
+	char separator1;		// '
+	char cardSerial;        // *
+	char SVCD[6];           // * 
+	char USRCHK;            // * 
+//	char endFlag;           // ?
+//  char LRC;
+	char stringEnd;
+} nwus_track_2;
+
+
+typedef struct NWUS_TRACK3  // 新系统用户卡  
+{
+//	char start;             // ;
+	char formatCode[2];     // 70
+	char USRNBR[6];         // *
+	char separator1;		// '
+	char passwordRetry;     // 5
+	char USRCHK;            // * 
+	char LENSTR[10];        // 0006010699
+	char cardSerial;        // *
+	char separator2;		// '
+	char SVCD[6];           // *
+	char CVCCHK;            // *
+	char separator3;		// '
+	char checkNum[6];       // 000000
+	char appendData[16];    // 8130379181303791
+//	char endFlag;           // ?
+//  char LRC;
+	char stringEnd;
+} nwus_track_3;
+
+typedef struct AE_TRACK2_DATA	// 运通借记卡oilyang 2021.9.23
+{
+	char account[15];		//*Primary Account Number
+	char separator1;		// Field Separator
+	char expireDate[4];     // Card Expiration Date
+	char serviceCode[3];    // Service Code
+	char effectiveDate[4];  // Card Effective Date
+	char cardSeCode[5];		// Card Security Code
+	char reserved[3];		// Card Serial(1) + (2)
+	char langCode[2];
+	char stringEnd;
+} ae_track2_data;
+typedef struct AE_T2_DATA
+{
+	char masterAccount[15];
+	char cardSerial;
+	char cardSeCode[5];
+	char expireDate[4];
+	char stringEnd;
+} ae_t2_data;
+
+#define TRACK_DATA_LEN 	300
+
+class CARD
+{
+private:
+	map<string,string> m_BinSvcCod;
+	void LoadFromFile();
+	string GetSvcCod(string key);
+public:
+	CARD(){LoadFromFile();};
+	~CARD(){};
+	char* SIGNCARD_ISOcode( SIGN_CARD_DATA *data); //hz, 97.01.30
+	char* SIGNCARD_ISOdecode( char *trackData); //hz, 97.01.30
+	char plus(char ch1, char ch2);
+	char minus(char ch1, char ch2);
+	char *plusString( char *str1, char *str2, int len);
+	char *minusString( char *str1, char *str2, int len);
+	char *codeUserCard( char *data);
+	char *decodeUserCard( char *data, char *SVCD);
+	char *codeUserCardTrack( char *data);
+	char *decodeUserCardTrack( char *data, char *SVCD);
+
+	char trackData[TRACK_DATA_LEN];
+	char getCheckNum(char *string, int len=0);
+	
+	BOOL ISOcode( char *data);
+	char* ISOdecode2( char *data);
+	char* ISOdecode3( char *data);
+	BOOL ISOdecode( char *data);
+
+	char* CREDIT_ISOdecode( char *data);
+
+	void INTERNET_ISOcode( char *PAN, char *CVV);
+	char* INTERNET_ISOdecode( char* PAN, char* CVV);
+
+    BOOL Track23( char *strTrack2, char *strTrack3, BOOL bWrite, char* MARGType="23" );
+    int  ISONewCardType(char * CardBin);
+    BOOL ISONewcode( char *data);
+    BOOL ISONewcode0( char *data);	//原来9字头卡
+    BOOL ISONewcode1( char *data);	//八转十六BZSL专用 6字头卡
+    BOOL ISONewdecode( char *data,char* MARGType="23");
+	BOOL ISOHKcode( char *data);	//Lint	香港一卡通专用
+	BOOL ISOHKdecode( char *data,char* MARGType="23");
+	BOOL ISOHKcode_help( char *data, BOOL isIC);	//Lint	香港一卡通专用
+	BOOL ISOHKdecode_help( char *data,char* MARGType, BOOL* isIC);
+    char* trimstr(char* strSrc);
+	BOOL ISOINTERcode( char *data);	//Lint	国际借记卡
+	BOOL ISOINTERcodetrack1( char *data, char *name, char *parmTrack1);
+	BOOL ISOINTERdecode( char *data,char* MARGType = "23");
+
+    //Cai 
+    BOOL ISONWPKcode( char *data);
+    BOOL ISONWPKdecode( char *data,char* MARGType="23");
+
+    BOOL ISONWUScode( char *data);
+    BOOL ISONWUSdecode( char *data,char* MARGType="23");
+
+	BOOL CMBcode( char * type, char * data, char* MagData);
+	BOOL CMBdecode( char* MagData, char * type, char * data);
+
+	BOOL CMBcodeEx( char * type, char * data, char* MagData);
+	BOOL CMBdecodeEx( char* MagData, char * type, char * data);
+	BOOL CMBdecodeMag2( char* Mag2Data, char * data);
+
+	//zhanglei, IC磁条卡, 20100919
+    BOOL ICcode( char *data);
+    BOOL ICdecode( char *data,char* MARGType="23");
+
+	BOOL Othdecode( char* MagData, char * type, char * data);
+
+};
+#if (!defined(_WIN32) && !defined(_WIN64))
+#include <stdint.h>
+#else
+#include <wtypes.h>
+#endif //NOT _WIN32
+
+#if (defined(_WIN32) || defined(_WIN64))
+#   ifdef CMB_CARD_TRACK_EXPORTS
+#       define CMB_CARD_TRACK_API __declspec(dllexport)
+#   else
+#       define CMB_CARD_TRACK_API __declspec(dllimport)
+#   endif
+#elif ( defined(__GNUC__) &&  __GNUC__ >= 4 )
+#   define CMB_CARD_TRACK_API __attribute__((visibility("default")))
+#else
+#   define CMB_CARD_TRACK_API
+#endif
+
+
+#ifdef __cplusplus
+extern "C"
+	{
+#endif
+
+CMB_CARD_TRACK_API bool CMBdecodeMag2(char* Mag2Data, char * data);
+CMB_CARD_TRACK_API bool CMBdecodeEx(char* MagData, char * type, char * data);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+class TPR50
+{
+public:
+	int BPType;
+};
+#endif

+ 39 - 0
Other/libCMBPrint/CMakeLists.txt

@@ -0,0 +1,39 @@
+set(MODULE_NAME "CMBPrint")
+set(MODULE_PREFIX "LIB_CMBPRINT")
+
+set(${MODULE_PREFIX}_SRCS
+    Card-v4.cpp
+    CARD-v4.HPP
+)
+
+add_library(${MODULE_NAME} SHARED ${${MODULE_PREFIX}_SRCS})
+
+
+target_include_directories(${MODULE_NAME} PRIVATE
+
+    )
+
+target_link_directories(${MODULE_NAME} PRIVATE 
+
+    )
+
+target_compile_definitions(${MODULE_NAME} PUBLIC "CMB_CARD_TRACK_EXPORTS")
+
+# 添加需要依赖的其他共享库(包括系统库)
+target_link_libraries(${MODULE_NAME} PRIVATE 
+)
+
+if(MSVC)
+	install(TARGETS ${MODULE_NAME} 
+    RUNTIME DESTINATION "${RVC_RUNTIME_PATH}" COMPONENT libraries
+    ARCHIVE DESTINATION "${RVC_LIBRARY_PATH}" COMPONENT develops EXCLUDE_FROM_ALL
+    LIBRARY DESTINATION "${RVC_LIBRARY_PATH}" COMPONENT libraries
+    )
+else(MSVC)
+install(TARGETS ${MODULE_NAME} 
+    RUNTIME DESTINATION "${RVC_RUNTIME_PATH}"
+    ARCHIVE DESTINATION "${RVC_LIBRARY_PATH}"
+    LIBRARY DESTINATION "${RVC_RUNTIME_PATH}"
+    COMPONENT libraries)
+endif(MSVC)
+

+ 2222 - 0
Other/libCMBPrint/Card-v4.cpp

@@ -0,0 +1,2222 @@
+//#include "stdafx.h"
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+
+//#include "tools.hpp"
+//#include "pr50-v0.h"
+#include "CARD-v4.HPP"
+
+//extern TPR50 pr50;
+
+TPR50 pr50;
+CARD* g_pCard = NULL;
+//extern TOOLS tools;
+
+char *CARD::SIGNCARD_ISOcode( SIGN_CARD_DATA *dat) //hz, 97.01.30
+{
+	static char trackData[300];
+	SIGN_CARD_TRACK2  defTrack2 =
+	{
+		//';',
+		{'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'},
+		'\'',
+		{'0','0','0','0'},
+		{'5','3','0'},
+		{'0','0','0','0','0','0','0','0','0','0','0'},
+		//'?',
+		0
+	};
+
+	static SIGN_CARD_TRACK3  defTrack3 =
+	{
+		//'!',
+		{'0','1'},
+		{'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'},
+		'\'',
+		{'1','5','6'},
+		{'1','5','6'},
+		'0',
+		{'5','0','0','0'},
+		{'5','0','0','0'},
+		{'0','0','0','0'},
+		{'0','1'},
+		'3',
+		{'0','0','0','0','0','0'},
+		{'5','3','0'},
+		{'0','0'},
+		{'0','0'},
+		{'0','0','0','0'},
+		{'1','0','0','0','0','0','0','0','0','0'},
+		{'0','0','0','0','0','0','0','0','0','0','0','0'},
+		'\'',
+		{'0','0','0','0','0','0','0','0','0','0','0','0'},
+		'\'',
+		'0',
+		{'0','0','0','0','0','0'},
+		'0',
+		//'?''
+		0
+	};
+
+	SIGN_CARD_TRACK2 *tk2 = &defTrack2;
+	memcpy(tk2->pan, dat->pan, 18);
+	memcpy(tk2->exprDate, dat->exprDate, 4);
+	memcpy(tk2->cvc, dat->cvc1, 3);
+
+	SIGN_CARD_TRACK3 *tk3 = &defTrack3;
+	memcpy(tk3->pan, dat->pan, 18);
+	memcpy(tk3->exprDate, dat->exprDate, 4);
+	memcpy(tk3->cvc, dat->cvc1, 3);
+
+	if( pr50.BPType == 1)
+		sprintf( trackData, "%sA%s", tk2, tk3);
+	else
+		sprintf( trackData, "%s", tk3);
+	return trackData;
+}
+
+char* CARD::SIGNCARD_ISOdecode( char *trackData) //hz, 97.01.30
+{
+	static char data[100];
+	char *pointer = trackData;
+
+	if( pr50.BPType == 1)
+	{
+		while( *pointer != 0 && *pointer != 'A') pointer++;
+		if(*pointer == 0)
+		{
+			*(char*)data=0;
+			return data;
+		}
+		pointer++;
+	}
+
+	if( memcmp( pointer, "01", 2) == 0)
+	{
+		SIGN_CARD_TRACK3 *tk3 = ( SIGN_CARD_TRACK3*)pointer;
+		memcpy( ((SIGN_CARD_DATA*)data)->pan, tk3->pan, 18);
+		memcpy( ((SIGN_CARD_DATA*)data)->exprDate, tk3->exprDate, 4);
+		memcpy( ((SIGN_CARD_DATA*)data)->cvc1, tk3->cvc, 3);
+	}
+	else    *(char*)data = 0;
+
+	return data;
+}
+
+char CARD::plus(char ch1, char ch2)
+{
+	return ( (ch1-'0') + (ch2-'0')) % 10 +'0';
+}
+
+char CARD::minus(char ch1, char ch2)
+{
+	int ch = (ch1-'0') - (ch2-'0');
+	if( ch < 0 ) ch += 10;
+	return (char)(ch+'0');
+}
+
+char *CARD::plusString( char *str1, char *str2, int len)
+{
+	static char string[20];
+	for( int i=0; i<len && i<20; i++)
+	{
+		string[i] = plus( str1[i], str2[i]);
+	}
+	return string;
+}
+
+char *CARD::minusString( char *str1, char *str2, int len)
+{
+	static char string[20];
+	for( int i=0; i<len && i<20; i++)
+	{
+		string[i] = minus( str1[i], str2[i]);
+	}
+	return string;
+}
+
+char *CARD::codeUserCard( char *data)
+{
+// data include:
+//	cardNo, 6
+//	userID, 5
+//	password, 6
+//	SVCD, 6
+	static char dest[50];
+	memcpy( dest, data, 8+5);
+	if( data[12]>='0'&&data[12]<='9')
+	{
+	    dest[8] = '0';
+	}
+	else if( data[12]>='A'&&data[12]<='Z')
+	{
+		char tmp[5];
+		sprintf(tmp,"%02d",data[12]-'A'+10);
+		dest[8] = tmp[0];
+		dest[12]= tmp[1];
+	}
+	memcpy( dest+8+5, plusString( data+8+5, data+8+5+6, 6), 6);
+	dest[ 8+5+6] = 0;
+	return dest;
+}
+
+char *CARD::codeUserCardTrack( char *data)
+{
+	static char dest[50];
+	if( pr50.BPType == 1) sprintf( dest, "A%s", codeUserCard( data));
+	else sprintf( dest, "%s", codeUserCard( data));
+	return dest;
+}
+
+char *CARD::decodeUserCard( char *data, char *SVCD)
+{
+	static char dest[50];
+	memcpy( dest, data, 8+5);
+	if ( data[8]!='0')
+	{
+		char tmp[5];
+		int tmpnum;
+		tmp[0]=data[8];
+		tmp[1]=data[12];
+		tmp[2]=0;
+        sscanf(tmp,"%d",&tmpnum);
+		dest[12]='A'+tmpnum-10;
+	}
+	dest[8] = 'S';
+	memcpy( dest+8+5, minusString( data+8+5, SVCD, 6), 6);
+	memcpy( dest+8+5+6, SVCD, 6);
+	dest[ 8+5+6+6] = 0;
+	return dest;
+}
+
+char *CARD::decodeUserCardTrack( char *data, char *SVCD)
+{
+	static char dest[1];
+	char *pointer = data;
+
+	if( pr50.BPType == 1)
+	{
+		while( *pointer != 0 && *pointer != 'A') pointer++;
+		if(*pointer == 0)
+		{
+			dest[0] = 0;
+			return dest;
+		}
+		pointer++;
+	}
+	return decodeUserCard( pointer, SVCD);
+}
+
+char CARD::getCheckNum(char *string, int len)
+{
+	if (len<=0)
+	{	len=strlen(string);
+	}
+	if (len<=0) return -1;
+	for( int i=0; i<len; i++)
+	{
+		if( string[i] > 0X39 || string[i] < 0x30) return -1;
+	}
+	int value = 0;
+	int tempValue = 0;
+	for(int i=0; i<len; i++)
+	{
+		tempValue = (string[i] - 0x30)*(i%2+1);
+		value += tempValue/10 + tempValue%10;
+	}
+	value = 10 - value%10;
+	if( value >= 10) value = 0;
+	return value+'0';
+}
+
+BOOL CARD::ISOcode( char *data)
+{
+////////////////////////////////
+// data struct
+// 1. Passbook
+// 0..3		Region Code
+// 4..13	Account No
+// 14..21	Passbook
+// 22..27   SVCD
+// total:28
+//
+// 2. Card
+// 0..3		Region Code
+// 4..11	Customer No
+// 12..13   99
+// 14..21	passbook
+// 22..27   SVCD
+// total:28
+
+    #define SEPARATOR '\''
+	
+	char *constStr1_0 = "1561560200020005213013";
+	char *constStr1_1 = "514000000001";
+	char *constStr2 = "0000000";
+
+	if( memcmp( data, "0755", 4) == 0)    
+	{
+		SZ_TRACK2 track2;
+		SZ_TRACK3 track3;
+		memcpy( track3.formatCode, "01", 2);
+
+		memcpy( &track3.masterAccount[0], "690755", 6);
+		memcpy( &track3.masterAccount[6], &data[4], 8);
+		track3.masterAccount[6+8] = 0;
+		track3.masterAccount[6+8] = getCheckNum( track3.masterAccount);
+		track3.separator1 = SEPARATOR;
+
+		memcpy( track3.constant1_0, constStr1_0, 22);
+		memcpy( track3.constant1_1, constStr1_1, 12);
+
+		track3.separator2 = SEPARATOR;
+
+		memcpy( track3.slave1, data+4, 10);
+		memcpy( track3.slave2, data+14, 8);
+		memcpy( track3.controlPara, data+22, 6);
+
+		track3.slave1[10] = 0;
+		track3.slave2[8]  = 0;
+		track3.slave1[10] = getCheckNum( track3.slave1);
+		track3.slave2[8]  = getCheckNum( track3.slave2);
+
+		track3.separator3 = SEPARATOR;
+		track3.separator4 = SEPARATOR;
+
+		memcpy( track3.constant2, constStr2, 7);
+
+		track3.cardType = '1';
+
+		memset( track3.area, '0', 8);
+		memcpy( track3.area, data, 4);
+		//track3.area[4] = data[ 22+6];  //track2 flag
+		if( pr50.BPType == 1)
+		{
+		  track3.area[4] = '1';  //track2 flag
+		}
+		else
+		{
+		  track3.area[4] = '0';  //track2 flag
+		}
+
+		track3.stringEnd = 0;
+
+		// copy track3 data to track2
+		memcpy( track2.masterAccount, track3.masterAccount, 15);
+		track2.separator1 = track3.separator1;	// = '\'';
+		memcpy( track2.constant, "1560000514", 10);
+		track2.cardType = track3.cardType;
+		memcpy( track2.area, track3.area, 8);
+		memcpy( track2.area+4, track3.controlPara+3, 3); //hz, 97.01.30
+		track2.stringEnd = 0;
+
+		if( pr50.BPType == 1)
+			sprintf( trackData, "%sA%s", (char*)&track2, (char*)&track3);
+		else 
+			sprintf( trackData, "%s", (char*)&track3);
+
+	}
+	else
+	{
+		TRACK2 track2;
+		TRACK3 track3;
+		memcpy( track3.formatCode, "01", 2);
+
+		memcpy( &track3.masterAccount[0], "690755", 6);
+		memcpy( &track3.masterAccount[6], &data[1], 3+8);
+		//memcpy( &track3.masterAccount[6], &data[1], 3+8);
+		track3.masterAccount[6+3+8] = 0;
+		track3.masterAccount[6+3+8] = getCheckNum( track3.masterAccount);
+		track3.separator1 = SEPARATOR;
+
+		//for( int i=0; i<40; i++) track3.constant1[i] = constStr1[i];
+		memcpy( track3.constant1_0, constStr1_0, 22);
+		//memcpy( track3.controlPara, "000000", 6);
+		memcpy( track3.constant1_1, constStr1_1, 12);
+
+		track3.separator2 = SEPARATOR;
+
+  	    memcpy( track3.slave1, data+4, 10);
+		memcpy( track3.slave2, data+14, 8);
+		memcpy( track3.controlPara, data+22, 6);
+		
+		track3.slave1[10] = 0;
+		track3.slave2[8]  = 0;
+		track3.slave1[10] = getCheckNum( track3.slave1);
+		track3.slave2[8]  = getCheckNum( track3.slave2);
+
+		track3.separator3 = SEPARATOR;
+		track3.separator4 = SEPARATOR;
+
+		memcpy( track3.constant2, constStr2, 7);
+
+		track3.cardType = '1';
+
+		memset( track3.area, '0', 8);
+		memcpy( track3.area, data, 4);
+		//track3.area[4] = data[ 22+6];  //track2 flag
+		if( pr50.BPType == 1)
+		{
+		  track3.area[4] = '1';  //track2 flag
+		}
+		else
+		{
+		  track3.area[4] = '0';  //track2 flag
+		}
+
+		track3.stringEnd = 0;
+
+		// copy track3 data to track2
+		memcpy( track2.masterAccount, track3.masterAccount, 15+3);
+		track2.separator1 = track3.separator1;	// = '\'';
+		memcpy( track2.constant, "1560000514", 10);
+		track2.cardType = track3.cardType;
+		memcpy( track2.area, track3.area, 7);
+		memcpy( track2.area+4, track3.controlPara+3, 3); //hz, 97.01.30
+		track2.stringEnd = 0;
+
+		if( pr50.BPType == 1)
+			sprintf( trackData, "%sA%s", (char*)&track2, (char*)&track3);
+		else 
+			sprintf( trackData, "%s", (char*)&track3);
+
+	}
+    return true;
+}
+
+char* CARD::ISOdecode2( char *data)
+{
+	static char mstAccount[30];
+	mstAccount[0] = 0;
+	char *pointer = trackData;
+
+	if( pr50.BPType != 1)
+	{
+		*data=0;
+		return mstAccount;
+	}
+
+	/*
+	if( ( //hz, Maybe have another no, so I delete it.
+	      //	memcmp( pointer, "01690755", 8) != 0 ||
+			(	memcmp( pointer, "690755755", 11) == 0
+				&& pointer[15] != '\''
+			)
+	    ) 	&& *tools.GetComboFromScreen( (UIW_WINDOW *)UI_WINDOW_OBJECT::windowManager->First(), "PSCD") == 'A')
+	{
+		*data = 0;
+		if( strlen( pointer) > 15)
+		{
+			if( pointer[15] == '\'')
+			{
+				memcpy( mstAccount, pointer, 15);
+				mstAccount[ 15] = 0;
+			}
+			else
+			{
+				memcpy( mstAccount, pointer, 18);
+				mstAccount[ 18] = 0;
+			}
+		}
+		return mstAccount;
+	}
+	else
+	*/
+	{
+		if( pointer[15] == '\'')
+		{
+			memcpy( data, pointer, 15);
+			data[ 15] = 0;
+		}
+		else
+		{
+			memcpy( data, pointer, 18);
+			data[ 18] = 0;
+		}
+	}
+	return mstAccount;
+}
+
+char* CARD::ISOdecode3( char *data)
+{
+	static char mstAccount[30];
+	mstAccount[0] = 0;
+	char *pointer = trackData;
+
+	if( pr50.BPType == 1)
+	{
+		while( *pointer != 0 && *pointer != 'A') pointer++;
+		if(*pointer == 0)
+		{
+			*data=0;
+			return mstAccount;
+		}
+		pointer++;
+	}
+
+	/*
+	if( ( //hz, Maybe have another no, so I delete it.
+	      //	memcmp( pointer, "01690755", 8) != 0 ||
+			(	memcmp( pointer, "01690755755", 11) == 0
+				&& pointer[15+2] != '\''
+			)
+	    ) 	&& *tools.GetComboFromScreen( (UIW_WINDOW *)UI_WINDOW_OBJECT::windowManager->First(), "PSCD") == 'A')
+	{
+		*data = 0;
+		if( strlen( pointer) > 15+2)
+		{
+			if( pointer[15+2] == '\'')
+			{
+				memcpy( mstAccount, pointer, 15+2);
+				mstAccount[ 15+2] = 0;
+			}
+			else
+			{
+				memcpy( mstAccount, pointer, 18+2);
+				mstAccount[ 18+2] = 0;
+			}
+		}
+		return mstAccount;
+	}
+	else
+	*/
+	{
+		if( pointer[15+2] == '\'')
+		{
+			memcpy( data, pointer+2, 15);
+			data[ 15] = 0;
+		}
+		else
+		{
+			memcpy( data, pointer+2, 18);
+			data[ 18] = 0;
+		}
+	}
+	return mstAccount;
+}
+
+BOOL CARD::ISOdecode( char *data)
+{
+////////////////////////////////
+// data struct
+// 1. Passbook
+// 0..3		Region Code
+// 4..13	Account No
+// 14..21	Passbook
+// 22..27   SVCD
+// total:28
+//
+// 2. Card
+// 0..3		Region Code
+// 4..11	Customer No
+// 12..13   99
+// 14..21	passbook
+// 22..27   SVCD
+// total:28
+
+	char *pointer = trackData;
+
+    data[0]=0;
+
+	//skip track 2
+	if( pr50.BPType == 1)
+	{
+		while( *pointer != 0 && *pointer != 'A') pointer++;
+		if(*pointer == 0)
+		{
+			return false;
+		}
+		pointer++;
+	}
+
+	if 	(	memcmp( pointer, "01690755755", 11) == 0
+				&& pointer[15+2] != '\''
+		)
+	{
+		return false;
+	}
+
+	// separator1
+	while( *pointer!=0 && *pointer != '\'') pointer++;
+	if(*pointer == 0)
+	{
+		return false;
+	}
+	pointer++;
+
+
+	//SVCD
+	memcpy(data+22,pointer+22, 6);
+
+	// separator2
+	while( *pointer!=0 && *pointer != '\'') pointer++;
+	if(*pointer == 0)
+	{
+		return false;
+	}
+	pointer++;
+
+	// get account no from slave1
+	memcpy( data+4, pointer, 10);
+
+	// separator3
+	while( *pointer!=0 && *pointer != '\'') pointer++;
+	if(*pointer == 0)
+	{
+		return false;
+	}
+	pointer++;
+
+	// get passbook/cardno from slave2
+	memcpy( data+14, pointer, 8);
+
+	// separator4
+	while( *pointer!=0 && *pointer != '\'') pointer++;
+	if(*pointer == 0)
+	{
+		return false;
+	}
+	pointer++;
+    
+	//region code
+	memcpy( data, pointer+8, 4); 
+
+	data[28] = 0;
+
+	return true;
+}
+
+char* CARD::CREDIT_ISOdecode( char *data)
+{
+////////////////////////////////
+// data struct
+// 1. Passbook
+// 0..3		Region Code
+// 4..11	Customer No
+// 4..13	Account No
+// 14..21	Passbook
+// total:22
+//
+// 2. Card
+// 0..3		Region Code
+// 4..11	Customer No
+// 11..13	const '99'
+// 14..21	CardNo
+// total:22
+	/*
+	FILE *file = fopen( "debug1", "wt");
+	fprintf( file, (char*)&trackData);
+	fclose(file);
+	*/
+	//printf( "%s\n", (char*)&trackData);
+	static char mstAccount[30];
+	mstAccount[0] = 0;
+	char *pointer = trackData;
+	//TRACK3 *track3;
+
+	if( pr50.BPType == 1)
+	{
+		while( *pointer != 0 && *pointer != 'A') pointer++;
+		if(*pointer == 0)
+		{
+			*data=0;
+			return mstAccount;
+		}
+		pointer++;
+	}
+
+	//track3=(TRACK3 *)pointer;
+	/*
+	FILE *fp = fopen( "debug", "wt");
+	fprintf( fp, "%s\n", pointer);
+	fclose( fp);
+	*/
+	//printf( "%s\n", pointer);
+
+        for( int i=0; i<2 && *pointer!=0 && *pointer!='\''; i++)
+        	pointer++;
+	// separator1
+	while( *pointer!=0 && *pointer != '\'')
+        {
+		*data = *pointer;
+                data++;
+		pointer++;
+        }
+        *data++ = '\'';
+
+	if(*pointer == 0)
+	{
+		*data=0;
+		return mstAccount;
+	}
+	pointer++;
+
+        memcpy( data, pointer+35, 4);//valid date
+        data += 4;
+        memcpy( data, "000", 3);//servic code
+        data += 3;
+
+	/*
+	// separator2
+	while( *pointer!=0 && *pointer != '\'') pointer++;
+	if(*pointer == 0)
+	{
+		*data=0;
+		return mstAccount;
+	}
+	pointer++;
+        */
+
+	// separator3
+	while( *pointer!=0 && *pointer != '\'') pointer++;
+	if(*pointer == 0)
+	{
+		*data=0;
+		return mstAccount;
+	}
+	pointer++;
+
+	// separator4
+	while( *pointer!=0 && *pointer != '\'') pointer++;
+	if(*pointer == 0)
+	{
+		*data=0;
+		return mstAccount;
+	}
+	pointer++;
+
+	//hz, 96.05.28 memcpy(data, track3->area, 4);
+	memcpy( data, pointer+1, 6);
+	*(data+6) = 0;
+
+	return mstAccount;
+}
+
+void CARD::INTERNET_ISOcode( char *PAN, char *CVV)
+{
+// parameter struct
+// PAN 10
+// CVV 6
+	if( strlen( PAN) != 10)
+        {
+        		//AfxMessageBox( "Error: length of PAN error!\n");
+                return;
+        }
+
+	if( strlen( CVV) != 6)
+        {
+        		//AfxMessageBox( "Error: length of CVV error!\n");
+                return;
+        }
+
+#define SEPARATOR '\''
+	INTERNET_TRACK2 track2;
+	INTERNET_TRACK3 track3;
+
+	memcpy( track2.PAN, "690000", 6);
+	memcpy( track2.PAN+6, PAN, 10);
+	track2.separator1[0] = SEPARATOR;
+	memcpy( track2.expirationDate, "9912", 4);
+        memcpy( track2.serviceCode, "120", 3);
+	memcpy( track2.CVV, CVV+3, 3);
+	track2.stringEnd = 0;
+
+	memcpy( track3.formatCode, "01", 2);
+	memcpy( track3.PAN, "690000", 6);
+	memcpy( track3.PAN+6, PAN, 10);
+	track3.separator1[0] = SEPARATOR;
+	memcpy( track3.countryCode, "156", 3);
+        memcpy( track3.currency, "156", 3);
+        memcpy( track3.currencyExponent, "0", 1);
+        memcpy( track3.amountAuthorized, "5000", 4);
+        memcpy( track3.amountRemaining, "5000", 4);
+        memcpy( track3.cycleBegin, "0000", 4);
+        memcpy( track3.cycleLength, "01", 2);
+	memcpy( track3.retryCount, "0", 1);
+        memcpy( track3.PINPARM, CVV, 6);
+        memcpy( track3.interchangeControl, "1", 1);
+        memcpy( track3.serviceRestriction, "20", 2);
+        memcpy( track3.SRofSAN1, "00", 2);
+        memcpy( track3.SRofSAN2, "00", 2);
+        memcpy( track3.expiryDate, "9912", 4);
+        memcpy( track3.sequenceNo, "1", 1);
+        track3.securityNo[0] = SEPARATOR;
+        memcpy( track3.SAN1, "000000000000", 12);
+        track3.separator2[0] = SEPARATOR;
+        memcpy( track3.SAN2, "000000000000", 12);
+        track3.separator3[0] = SEPARATOR;
+        memcpy( track3.relayMarker, "0", 1);
+        memcpy( track3.CCD, "000000", 6);
+        track3.transactionDate[0] = SEPARATOR;
+        track3.AVV[0] = SEPARATOR;
+        memcpy( track3.INNIC, CVV, 3);
+        memcpy( track3.CVV, CVV+3, 3);
+	track3.stringEnd = 0;
+
+	if( pr50.BPType == 1)
+		sprintf( trackData, "%sA%s", (char*)&track2, (char*)&track3);
+	else
+		sprintf( trackData, "%s", (char*)&track3);
+}
+
+char* CARD::INTERNET_ISOdecode( char* PAN, char* CVV)
+{
+	static char staticPAN[30];
+	staticPAN[0] = 0;
+	char *pointer = trackData;
+
+        //printf( "%s\n", trackData);
+
+	if( pr50.BPType == 1)
+	{
+		while( *pointer != 0 && *pointer != 'A') pointer++;
+		if(*pointer == 0)
+		{
+			*PAN = 0;
+                        *CVV = 0;
+			return staticPAN;
+		}
+		pointer++;
+	}
+
+        INTERNET_TRACK3 *track3 = (INTERNET_TRACK3 *)pointer;
+        memcpy( PAN, track3->PAN+6, 10);
+        PAN[10] = 0;
+        memcpy( CVV, track3->PINPARM, 6);
+        CVV[10] = 0;
+        memcpy( staticPAN, track3->PAN+6, 10);
+        staticPAN[10] = 0;
+
+        //printf( "%s\n", staticPAN);
+	return staticPAN;
+}
+
+BOOL CARD::Track23( char *strTrack2, char *strTrack3, BOOL bWrite, char* MARGType )
+{
+	char *pDivide;
+
+	if (bWrite)
+	{
+		if( pr50.BPType == 1)
+			sprintf( this->trackData, "%sA%s", strTrack2, strTrack3);
+		else 
+			sprintf( this->trackData, "%s", strTrack3);  //二当三!
+	}
+	else
+	{
+		if( pr50.BPType == 1)
+		{
+			if( strcmp(MARGType,"23")==0 || strcmp(MARGType,"3")==0 )
+			{
+				pDivide=strstr(this->trackData,"A");
+                if (pDivide==NULL)
+				{
+					strTrack2[0]=0;
+					strTrack3[0]=0;
+					return FALSE;
+				}
+				memcpy(strTrack2, this->trackData,pDivide-this->trackData);
+				strTrack2[pDivide-this->trackData]=0;
+				strcpy(strTrack3,pDivide+1);
+			}
+			else if( strcmp(MARGType,"2")==0 )
+			{
+				strcpy(strTrack2,this->trackData);
+				strTrack3[0]=0;
+			}
+			else
+			{
+				strTrack2[0]=0;
+				strTrack3[0]=0;
+				return FALSE;
+			}
+		}
+		else
+		{
+			strTrack2[0]=0;
+			strcpy(strTrack3,this->trackData);
+		}
+	}
+	return TRUE;
+}
+
+int  CARD::ISONewCardType(char * CardBin)
+{
+   if (CardBin[0]=='6')
+   {
+     return 1;
+   }
+   else
+   {
+     return 0;
+   } 
+}
+
+BOOL CARD::ISONewcode( char *data)  
+{
+ 
+    NEW_TRACK0 *pdata;
+    char CardBin[10];   
+    int CardType;
+
+    pdata=(NEW_TRACK0 *)data;
+    memcpy(CardBin,pdata->masterAccount,6);
+    CardBin[6]=0;
+    CardType=ISONewCardType( CardBin);
+    if( CardType==0 )
+    {
+      return ISONewcode0(data);
+    }
+    else
+    {
+      return ISONewcode1(data);
+    }
+}    
+
+
+BOOL CARD::ISONewcode0( char *data)  //9字头卡
+{
+    NEW_TRACK0 *pdata;
+    NEW_TRACK2 strTrack2;
+    NEW_TRACK3 strTrack3;
+
+    char defNewTrack2[]= "9555500000000000\'49121200000000000000";
+    char defNewTrack3[]= "999555500000000000\'1561560500050000001015000000214000049120\'0000000000\'000000000\'00000000000000000000000";
+
+	pdata=(NEW_TRACK0 *)data;
+	strcpy((char*)&strTrack2,defNewTrack2);
+	strcpy((char*)&strTrack3,defNewTrack3);
+
+	memcpy(strTrack2.masterAccount,pdata->masterAccount,sizeof(pdata->masterAccount));
+	memcpy(strTrack2.appendData,pdata->SVCD,sizeof(pdata->SVCD));
+    strTrack2.appendData[6]=pdata->cardSerial;
+    strTrack2.appendData[7]=getCheckNum(pdata->masterAccount,sizeof(pdata->masterAccount));
+	memcpy(strTrack2.expireDate,pdata->expireDate,sizeof(strTrack2.expireDate));
+
+
+	memcpy(strTrack3.masterAccount,pdata->masterAccount,sizeof(pdata->masterAccount));
+	memcpy(strTrack3.SVCD,pdata->SVCD,sizeof(pdata->SVCD));
+    strTrack3.cardSerial=pdata->cardSerial;
+	memcpy(strTrack3.SAN1,(pdata->masterAccount)+6,sizeof(strTrack3.SAN1));
+	memcpy(strTrack3.appendData,pdata->oldRGCD,sizeof(pdata->oldRGCD));
+	memcpy(strTrack3.expireDate,pdata->expireDate,sizeof(strTrack3.expireDate));
+    strTrack3.checkNum[0]=getCheckNum(pdata->masterAccount,sizeof(pdata->masterAccount));
+
+	return Track23((char*)&strTrack2,(char*)&strTrack3,TRUE);
+}
+
+BOOL CARD::ISONewcode1( char *data)  // 6字头卡
+/*	BZSL	八转十六项目
+ *	函数名:BOOL CARD::ISONewcode1( char *data)
+ *	功能:	对6开头的16位卡按照:2磁道为两地通2磁道格式,
+ *			3磁道为普通16位卡3磁道格式进行写磁的操作
+ */
+{
+    NEW_TRACK0 *pdata;
+    NEW1_TRACK2 strTrack2;
+    NEW_TRACK3 strTrack3;
+	int randValue = 0;
+	char strTmp[128];
+	char defNew1Track2[38]= "0000000000000000"
+						"\'"
+						"4912"
+						"120"
+						"12345"
+						"00888000";
+
+    char defNewTrack3[]= "999555500000000000\'1561560500050000001015000000214000049120\'0000000000\'000000000\'00000000000000000000000";
+	
+	pdata=(NEW_TRACK0 *)data;
+	strcpy((char*)&strTrack2,defNew1Track2);
+	strcpy((char*)&strTrack3,defNewTrack3);
+
+	memcpy(strTrack2.masterAccount,pdata->masterAccount,sizeof(pdata->masterAccount));
+	do
+	{
+		srand( (unsigned)time( NULL ) );
+		randValue = rand();
+	}while(randValue == 0);
+	sprintf(strTmp,"%05d",(unsigned int)randValue);
+	memcpy(strTrack2.localCheckMessage,strTmp,5);
+
+	strTrack2.appendData[1]=pdata->cardSerial;  //此处做了修改
+/*
+	randValue = 0;
+	do
+	{
+		srand( (unsigned)time( NULL ) );
+		randValue = rand();
+	}while(randValue == 0);
+	sprintf(strTmp,"%02d",(unsigned int)randValue);
+	memcpy(strTrack2.appendData,strTmp,2);
+*/
+	
+	memcpy(strTrack2.expireDate,pdata->expireDate,sizeof(strTrack2.expireDate));
+
+	memcpy(strTrack2.appendData+2,pdata->SVCD,6);  //此处做了修改
+/*	
+	memcpy(strTrack2.appendData+2,pdata->SVCD,3);
+	randValue = 0;
+	do
+	{
+		srand( (unsigned)time( NULL ) );
+		randValue = rand();
+	}while(randValue == 0);
+	sprintf(strTmp,"%03d",(unsigned int)randValue);
+	memcpy(strTrack2.appendData+5,strTmp,3);
+*/
+
+	//3磁道采用老的95555卡的3磁道格式
+	memcpy(strTrack3.masterAccount,pdata->masterAccount,sizeof(pdata->masterAccount));
+	memcpy(strTrack3.SVCD,strTrack2.appendData+2,6);	
+	strTrack3.cardSerial=pdata->cardSerial;
+	memcpy(strTrack3.SAN1,(pdata->masterAccount)+6,sizeof(strTrack3.SAN1));
+	memcpy(strTrack3.appendData,pdata->oldRGCD,sizeof(pdata->oldRGCD));
+	memcpy(strTrack3.expireDate,pdata->expireDate,sizeof(strTrack3.expireDate));
+    strTrack3.checkNum[0]=getCheckNum(pdata->masterAccount,sizeof(pdata->masterAccount));
+
+/*	//增加IC借记卡,zhanglei,2011.12.15
+	1.621486(银联IC金葵花)(服务代码 220)
+	2.621485(银联IC金卡)(服务代码 220)
+	3.621483(银联IC普卡) (服务代码 220)
+*/
+/*  //改用配置文件的方式,zhanglei,20141011
+	if ((strncmp((char*)&strTrack2, "621486", 6) == 0) || (strncmp((char*)&strTrack2, "621485", 6) == 0) ||
+		(strncmp((char*)&strTrack2, "621483", 6) == 0))
+		memcpy(strTrack2.serviceCode, "220", 3);
+*/
+	string binCod;
+	binCod.assign((char*)&strTrack2, 6);
+	string svcCod = this->GetSvcCod(binCod);
+	if (svcCod != "")
+		memcpy(strTrack2.serviceCode, svcCod.c_str(), 3);
+	return Track23((char*)&strTrack2,(char*)&strTrack3,TRUE);
+}
+
+BOOL CARD::ICcode( char *data)  // IC磁条卡,逻辑基本copy ISONewcode1,修改处有注释
+{
+    IC_TRACK0 *pdata;
+    IC_TRACK2 strTrack2;
+    IC_TRACK3 strTrack3;
+	int randValue = 0;
+	char strTmp[128];
+	char defNew1Track2[]= "0000000000000000000"
+						"\'"
+						"4912"
+						"620" //服务代码620 zhanglei
+						"123"
+						"0888000";
+
+    char defNewTrack3[]= "999555500000000000000\'1561560500050000001015000000214000049120\'0000000000\'000000000\'00000000000000000000";
+	
+	pdata=(IC_TRACK0 *)data;
+	strcpy((char*)&strTrack2,defNew1Track2);
+	strcpy((char*)&strTrack3,defNewTrack3);
+
+	memcpy(strTrack2.masterAccount,pdata->masterAccount,sizeof(pdata->masterAccount));
+	do
+	{
+		srand( (unsigned)time( NULL ) );
+		randValue = rand();
+	}while(randValue == 0);
+	sprintf(strTmp,"%03d",(unsigned int)randValue);
+	memcpy(strTrack2.localCheckMessage,strTmp,3);
+
+	strTrack2.appendData[0]=pdata->cardSerial;  //此处做了修改 zhanglei
+/*
+	randValue = 0;
+	do
+	{
+		srand( (unsigned)time( NULL ) );
+		randValue = rand();
+	}while(randValue == 0);
+	sprintf(strTmp,"%02d",(unsigned int)randValue);
+	memcpy(strTrack2.appendData,strTmp,2);
+*/
+	
+	memcpy(strTrack2.expireDate,pdata->expireDate,sizeof(strTrack2.expireDate));
+
+	memcpy(strTrack2.appendData+1,pdata->SVCD,6);  //此处做了修改 zhanglei
+/*	
+	memcpy(strTrack2.appendData+2,pdata->SVCD,3);
+	randValue = 0;
+	do
+	{
+		srand( (unsigned)time( NULL ) );
+		randValue = rand();
+	}while(randValue == 0);
+	sprintf(strTmp,"%03d",(unsigned int)randValue);
+	memcpy(strTrack2.appendData+5,strTmp,3);
+*/
+
+	//3磁道采用老的95555卡的3磁道格式
+	memcpy(strTrack3.masterAccount,pdata->masterAccount,sizeof(pdata->masterAccount));
+	memcpy(strTrack3.SVCD,strTrack2.appendData+1,6);	 //取二磁道SVCD, zhanglei
+	strTrack3.cardSerial=pdata->cardSerial;
+	memcpy(strTrack3.SAN1,(pdata->masterAccount)+9,sizeof(strTrack3.SAN1));
+	memcpy(strTrack3.appendData,pdata->oldRGCD,sizeof(pdata->oldRGCD));
+	memcpy(strTrack3.expireDate,pdata->expireDate,sizeof(strTrack3.expireDate));
+    strTrack3.checkNum[0]=getCheckNum(pdata->masterAccount,sizeof(pdata->masterAccount));
+
+	return Track23((char*)&strTrack2,(char*)&strTrack3,TRUE);
+}
+
+BOOL CARD::ISOHKcode( char *data)
+{
+	return ISOHKcode_help(data, FALSE);
+}
+
+BOOL CARD::ISOHKcode_help( char *data, BOOL isIC)
+/*	香港一卡通专用
+ *	Lint
+ */
+{
+    HK_TRACK0 *pdata;
+	// NEW1_TRACK2 与 HK_TRACK2 相同
+    HK_TRACK2 strTrack2;
+    HK_TRACK3 strTrack3;
+
+	char defNew1Track2[38]= "0000000000000000"
+						"\'"
+						"4912"
+						"120"
+						"12345"
+						"00888000";
+
+	char defNew1Track2_IC[38]= "0000000000000000"
+						"\'"
+						"4912"
+						"220"
+						"12345"
+						"00888000";
+
+	char defHKTrack2[38]= "4026580000000000"
+						"\'"
+						"0000"
+						"101"
+						"12345"
+						"00888000";
+
+	char defHKTrack3[105]= "92"
+						"40"
+						"2658"
+						"600000000000"
+						"\'\'"
+						"000"
+						"0"
+						"00"
+						"00"
+						"0000"
+						"0000"
+						"00"
+						"4"
+						"000000"
+						"0"
+						"10"
+						"00"
+						"00"
+						"0000"
+						"00"
+						//"000000000000"
+						//"000000000000"
+		                "000000000000000123000000"
+						"0000"
+						"0000"
+						"0000"
+						"0000"
+						"000"
+						"1";
+	int randValue = 0;
+	char strTmp[128];
+
+	pdata=(HK_TRACK0 *)data;
+	if (pdata->masterAccount[0]=='4')  //402658
+	{
+	    strcpy((char*)&strTrack2,defHKTrack2);
+	}
+	else  //621299
+	{
+ 	    if (isIC == TRUE)
+			strcpy((char*)&strTrack2,defNew1Track2_IC);
+		else
+			strcpy((char*)&strTrack2,defNew1Track2);
+	}
+
+	strcpy((char*)&strTrack3,defHKTrack3);
+
+	memcpy(strTrack2.masterAccount,pdata->masterAccount,sizeof(pdata->masterAccount));
+	do
+	{
+		srand( (unsigned)time( NULL ) );
+		randValue = rand();
+	}while(randValue == 0);
+	sprintf(strTmp,"%05d",(unsigned int)randValue);
+	memcpy(strTrack2.localCheckMessage,strTmp,5);
+
+	strTrack2.appendData[1]=pdata->cardSerial;  //此处做了修改
+/*
+	randValue = 0;
+	do
+	{
+		srand( (unsigned)time( NULL ) );
+		randValue = rand();
+	}while(randValue == 0);
+	sprintf(strTmp,"%02d",(unsigned int)randValue);
+	memcpy(strTrack2.appendData,strTmp,2);
+*/
+	memcpy(strTrack2.appendData+2,pdata->SVCD,6);  //此处做了修改
+
+/*	
+	memcpy(strTrack2.appendData+2,pdata->SVCD,3);
+	
+	randValue = 0;
+	do
+	{
+		srand( (unsigned)time( NULL ) );
+		randValue = rand();
+	}while(randValue == 0);
+	sprintf(strTmp,"%03d",(unsigned int)randValue);
+	memcpy(strTrack2.appendData+5,strTmp,3);
+*/	
+	memcpy(strTrack2.expireDate,pdata->expireDate,sizeof(strTrack2.expireDate));
+	
+
+
+//	memcpy(strTrack3.masterAccount,pdata->masterAccount+6,10);
+//  此处做了修改
+	memcpy(strTrack3.cardType,pdata->masterAccount,sizeof(pdata->masterAccount));
+	memcpy(strTrack3.masterAccount+10,"00",2);
+	memcpy(strTrack3.expireDate,pdata->expireDate,sizeof(strTrack3.expireDate));
+	strTrack3.language = pdata->language;
+	*(strTrack3.cardSerial+1)=pdata->cardSerial;
+
+/************************
+
+>                   子帐号              帐号类型      子帐号限制码     货币代码
+》主账号    :    621299860*******           1             0              1(HKD)
+> 港币子帐户:   860XXXXXXX01               1             0              1(HKD)
+> 人民币子帐户: 860XXXXXXX03               1             0              3(RMB)
+> 其中  XXXXXXX 为PAN号的最后7位。
+  
+************************/
+
+	if (isIC == TRUE)  
+	{
+		memcpy(strTrack3.appendData, "860", 3);
+		memcpy(strTrack3.appendData+3, pdata->masterAccount+9, 7);
+		memcpy(strTrack3.appendData+10, "01", 2);
+		memcpy(strTrack3.appendData+12, "860", 3);
+		memcpy(strTrack3.appendData+15, pdata->masterAccount+9, 7);
+		memcpy(strTrack3.appendData+22, "03", 2);
+		strTrack3.firstSubsidiaryAccountLimit = '0';
+		strTrack3.firstSubsidiaryAccountType = '1';
+		memcpy(strTrack3.secondSubsidiaryAccountMessage, "10", 2);
+		memcpy(strTrack3.currencyCode, "113", 3);
+		strTrack3.exchangeCode = '9';
+
+	}
+	else
+	{
+		
+	/******************************************
+	*	取当前日期的函数需要在DOS进行重新编写
+		******************************************/
+#ifdef linux
+		memset(strTmp,0,128);
+		tzset();
+		time_t now = time(NULL);
+		strftime(strTmp,128,"%m/%d/%y",localtime(&now));
+
+#else
+		_tzset();
+		_strdate(strTmp);
+#endif
+		memcpy(strTrack3.appendData,"20",2);
+		memcpy(strTrack3.appendData+2,strTmp,2);
+		memcpy(strTrack3.appendData+4,strTmp+3,2);
+		memcpy(strTrack3.appendData+6,strTmp+6,2);
+		
+		randValue = 0;
+		do
+		{
+			srand( (unsigned)time( NULL ) );
+			randValue = rand();
+		}while(randValue == 0);
+		sprintf(strTmp,"%07d",(unsigned int)randValue);
+		memcpy(strTrack3.appendData+8,strTmp,7);
+		
+		//此处做了修改
+		memcpy(strTrack3.appendData+15,pdata->SVCD,6);
+		randValue = 0;
+		do
+		{
+			srand( (unsigned)time( NULL ) );
+			randValue = rand();
+		}while(randValue == 0);
+		sprintf(strTmp,"%03d",(unsigned int)randValue);
+		memcpy(strTrack3.appendData+21,strTmp,3);     
+		
+		/*
+		memcpy(strTrack3.appendData+15,pdata->SVCD,3);
+		
+		  randValue = 0;
+		  do
+		  {
+		  srand( (unsigned)time( NULL ) );
+		  randValue = rand();
+		  }while(randValue == 0);
+		  sprintf(strTmp,"%06d",(unsigned int)randValue);
+		  memcpy(strTrack3.appendData+18,strTmp,6);
+		*/
+	}
+
+	strTrack3.PIN = pdata->PIN;
+	memcpy(strTrack3.PINOffset,pdata->PINOffset,sizeof(strTrack3.PINOffset));
+	return Track23((char*)&strTrack2,(char*)&strTrack3,TRUE);
+}
+
+BOOL CARD::ISONewdecode( char *data,char* MARGType)
+{
+    NEW_TRACK0 *pdata;
+    NEW_TRACK2 strTrack2; // maxof(NEW_TRACK2, NEW1_TRACK2)
+    NEW_TRACK3 strTrack3;
+
+/*
+    char CardBin[10];   
+    int CardType;
+*/
+
+
+
+	data[0]=0;
+	if( !Track23((char*)&strTrack2,(char*)&strTrack3,FALSE,MARGType) )
+	    return FALSE;
+	if ( strlen((char*)&strTrack3)!=sizeof(NEW_TRACK3)-1)
+	    return FALSE;
+	pdata=(NEW_TRACK0 *)data;
+	memset((char*)pdata,'0',sizeof(NEW_TRACK0));
+	pdata->stringEnd=0; 
+	memcpy(pdata->masterAccount,strTrack3.masterAccount,sizeof(pdata->masterAccount));
+    pdata->cardSerial=strTrack3.cardSerial;
+
+	memcpy(pdata->SVCD,strTrack3.SVCD,sizeof(pdata->SVCD));  //此处做了修改
+
+/*
+
+    memcpy(CardBin,pdata->masterAccount,6);
+    CardBin[6]=0;
+    CardType=ISONewCardType(CardBin);
+    if (CardType==1)	//需要后面补零
+    {
+    	memcpy(pdata->SVCD,strTrack3.SVCD,3);
+    	memcpy(pdata->SVCD+3,"000",3);
+    }
+    else
+ 		memcpy(pdata->SVCD,strTrack3.SVCD,sizeof(pdata->SVCD));
+    //八转十六BZSL	以上工作为将6开头的卡号的SVCD码后3位强制置0,其他卡号不变
+
+*/
+
+  	
+	memcpy(pdata->oldRGCD,strTrack3.appendData,sizeof(pdata->oldRGCD));
+	memcpy(pdata->expireDate,strTrack3.expireDate,sizeof(strTrack3.expireDate));
+	return TRUE;
+}
+
+BOOL CARD::CMBdecodeMag2( char* Mag2Data, char * data)
+{
+    NEW_TRACK0 *pdata;
+	NEW1_TRACK2 *Track2;
+
+	data[0]=0;
+	if ( strlen(Mag2Data)!=37)
+	    return FALSE;
+	//so ugly
+	if (memcmp(Mag2Data,"370576",6) == 0 || memcmp(Mag2Data,"374820",6) == 0 || memcmp(Mag2Data,"374821",6) == 0)
+	{
+		AE_TRACK2_DATA *pTrack2Data;
+		AE_T2_DATA *pT2Data;
+		pTrack2Data = (AE_TRACK2_DATA*)Mag2Data;
+		pT2Data = (AE_T2_DATA*)data;
+		memset((char*)pT2Data,'0',sizeof(AE_T2_DATA));
+		pT2Data->stringEnd=0;
+		memcpy(pT2Data->masterAccount,pTrack2Data->account,sizeof(pT2Data->masterAccount));
+		pT2Data->cardSerial = pTrack2Data->reserved[0];
+		memcpy(pT2Data->cardSeCode,pTrack2Data->cardSeCode,sizeof(pT2Data->cardSeCode));
+		memcpy(pT2Data->expireDate,pTrack2Data->expireDate,sizeof(pT2Data->expireDate));
+		return TRUE;
+	}
+	pdata=(NEW_TRACK0 *)data;
+	Track2 = (NEW1_TRACK2 *)Mag2Data;
+	memset((char*)pdata,'0',sizeof(NEW_TRACK0));
+	pdata->stringEnd=0; 
+	memcpy(pdata->masterAccount, Track2->masterAccount,sizeof(pdata->masterAccount));
+    pdata->cardSerial=Track2->appendData[1];
+	memcpy(pdata->expireDate, Track2->expireDate, sizeof(pdata->expireDate));
+	memcpy(pdata->SVCD,Track2->appendData+2,sizeof(pdata->SVCD));
+	return TRUE;
+}
+
+BOOL CARD::ICdecode( char *data,char* MARGType)
+{
+    IC_TRACK0 *pdata;
+    IC_TRACK2 strTrack2; // maxof(NEW_TRACK2, NEW1_TRACK2)
+    IC_TRACK3 strTrack3;
+
+/*
+    char CardBin[10];   
+    int CardType;
+*/
+
+
+
+	data[0]=0;
+	if( !Track23((char*)&strTrack2,(char*)&strTrack3,FALSE,MARGType) )
+	    return FALSE;
+	if ( strlen((char*)&strTrack3)!=sizeof(NEW_TRACK3)-1)
+	    return FALSE;
+	pdata=(IC_TRACK0 *)data;
+	memset((char*)pdata,'0',sizeof(NEW_TRACK0));
+	pdata->stringEnd=0; 
+	memcpy(pdata->masterAccount,strTrack3.masterAccount,sizeof(pdata->masterAccount));
+    pdata->cardSerial=strTrack3.cardSerial;
+
+	memcpy(pdata->SVCD,strTrack3.SVCD,sizeof(pdata->SVCD));  //此处做了修改
+
+/*
+
+    memcpy(CardBin,pdata->masterAccount,6);
+    CardBin[6]=0;
+    CardType=ISONewCardType(CardBin);
+    if (CardType==1)	//需要后面补零
+    {
+    	memcpy(pdata->SVCD,strTrack3.SVCD,3);
+    	memcpy(pdata->SVCD+3,"000",3);
+    }
+    else
+ 		memcpy(pdata->SVCD,strTrack3.SVCD,sizeof(pdata->SVCD));
+    //八转十六BZSL	以上工作为将6开头的卡号的SVCD码后3位强制置0,其他卡号不变
+
+*/
+
+  	
+	memcpy(pdata->oldRGCD,strTrack3.appendData,sizeof(pdata->oldRGCD));
+	memcpy(pdata->expireDate,strTrack3.expireDate,sizeof(strTrack3.expireDate));
+	return TRUE;
+}
+
+BOOL CARD::ISOHKdecode( char *data,char* MARGType)
+{
+	BOOL isIC;
+	return ISOHKdecode_help(data, MARGType, &isIC);
+}
+
+BOOL CARD::ISOHKdecode_help( char *data,char* MARGType, BOOL* isIC)
+{
+    HK_TRACK0 *pdata;
+    HK_TRACK2 strTrack2;
+    HK_TRACK3 strTrack3;
+
+
+	data[0]=0;
+	if( !Track23((char*)&strTrack2,(char*)&strTrack3,FALSE,MARGType) )
+	    return FALSE;
+
+	if ((strTrack2.serviceCode[0] == '2') && (strTrack2.serviceCode[1] == '2') &&
+		(strTrack2.serviceCode[2] == '0'))
+		*isIC = TRUE;
+	else
+		*isIC = FALSE;
+
+	pdata=(HK_TRACK0 *)data;
+	memset((char*)pdata,'0',sizeof(HK_TRACK0));
+	pdata->stringEnd=0;
+	
+	memcpy(pdata->masterAccount,strTrack2.masterAccount,sizeof(pdata->masterAccount));
+    pdata->cardSerial=strTrack3.cardSerial[1];
+	memcpy(pdata->SVCD,strTrack2.appendData+2,6);  //此处做了修改
+//	memcpy(pdata->SVCD,strTrack2.appendData+2,3);  
+	if (pdata->masterAccount[0]=='4')
+	{
+	    memcpy(pdata->oldRGCD,"0000",sizeof(pdata->oldRGCD));
+	}
+	else
+	{
+	    memcpy(pdata->oldRGCD,"0852",sizeof(pdata->oldRGCD));
+	}
+//  memcpy(pdata->oldRGCD,"0755",sizeof(pdata->oldRGCD));  //此处做了修改
+
+	memcpy(pdata->expireDate,strTrack3.expireDate,sizeof(strTrack3.expireDate));
+    pdata->language = strTrack3.language ;
+	pdata->PIN = strTrack3.PIN;
+	memcpy(pdata->PINOffset,strTrack3.PINOffset,sizeof(strTrack3.PINOffset));
+
+	return TRUE;
+}
+
+
+/*
+void main()
+{
+	char *data = "12345678S7890098765656565";
+	char *dest = codeUserCard( data);
+	printf( "%s\n", dest);
+	char *dest1 = decodeUserCard( dest, "656565");
+	printf( "%s\n", dest1);
+	if( strcmp( data, dest1) == 0) printf( "ok\n");
+}
+*/
+
+char* CARD::trimstr(char* strSrc)
+{
+	int i,len;
+	len=strlen(strSrc);
+	if (len<=0)
+	{
+		return strSrc;
+	}
+	//trim right
+	for(i=len-1;i>=0;i--)
+	{
+	  if (strSrc[i]!=' ')
+	  {
+		break;
+	  }
+	}
+	strSrc[i+1]=0;
+	//trim left
+	i=0;
+	while(strSrc[i]==' ')
+	{  i++;
+	}
+    if (i>0)
+    {
+       memmove(strSrc,strSrc+i,len+1-i);
+    }
+	return strSrc;
+}
+
+
+BOOL CARD::ISOINTERcode( char *data)
+/*	国际借记卡专用
+ *	Lint
+ */
+{
+    INTER_TRACK0 *pdata;
+    INTER_TRACK2 strTrack2;
+    INTER_TRACK3 strTrack3;
+	char defINTERTrack2[38]= "4026580000000000"
+						"\'"
+						"0000"
+						"101"
+						"12345"
+						"00888000";
+	char defINTERTrack3[105]= "99"
+						"41"
+						"0062"
+						"6000000000"
+						"\'"
+						"156"
+						"156"
+						"0"
+						"5000"
+						"5000"
+						"0000"
+						"01"
+						"5"
+						"000000"
+						"2"
+						"1"
+						"4"
+						"00"
+						"00"
+						"0000"
+						"0"
+						"\'"
+		                "0000000000"
+						"\'"
+						"000000000"
+						"\'"
+						"0"
+						"000000"
+						"0000000000000000";
+	int randValue = 0;
+	char strTmp[128];
+
+	pdata=(INTER_TRACK0 *)data;
+	strcpy((char*)&strTrack2,defINTERTrack2);
+	strcpy((char*)&strTrack3,defINTERTrack3);
+
+	memcpy(strTrack2.masterAccount,pdata->masterAccount,sizeof(pdata->masterAccount));
+	do
+	{
+		srand( (unsigned)time( NULL ) );
+		randValue = rand();
+	}while(randValue == 0);
+	sprintf(strTmp,"%05d",(unsigned int)randValue);
+	memcpy(strTrack2.localCheckMessage,strTmp,5);
+
+	strTrack2.appendData[1]=pdata->cardSerial;  //此处做了修改
+/*
+	randValue = 0;
+	do
+	{
+		srand( (unsigned)time( NULL ) );
+		randValue = rand();
+	}while(randValue == 0);
+	sprintf(strTmp,"%02d",(unsigned int)randValue);
+	memcpy(strTrack2.appendData,strTmp,2);
+*/
+
+	memcpy(strTrack2.appendData+2,pdata->SVCD,6);  //此处做了修改
+/*	
+	memcpy(strTrack2.appendData+2,pdata->SVCD,3);
+	
+	randValue = 0;
+	do
+	{
+		srand( (unsigned)time( NULL ) );
+		randValue = rand();
+	}while(randValue == 0);
+	sprintf(strTmp,"%03d",(unsigned int)randValue);
+	memcpy(strTrack2.appendData+5,strTmp,3);
+*/
+	
+	memcpy(strTrack2.expireDate,pdata->expireDate,sizeof(strTrack2.expireDate));
+
+	string binCod;
+	binCod.assign((char*)&strTrack2, 6);
+	string svcCod = this->GetSvcCod(binCod);
+	if (svcCod != "")
+		memcpy(strTrack2.serviceCode, svcCod.c_str(), 3);	
+
+	memcpy(strTrack3.formatCode,"99",2);
+	memcpy(strTrack3.cardType,pdata->masterAccount,2);
+	memcpy(strTrack3.bankSign,pdata->masterAccount+2,4);
+	memcpy(strTrack3.masterAccount,pdata->masterAccount+6,10);
+
+	memcpy(strTrack3.grantControlCode,pdata->SVCD,6);  //此处做了修改
+/*	
+	memcpy(strTrack3.grantControlCode,pdata->SVCD,3);
+	randValue = 0;
+	do
+	{
+		srand( (unsigned)time( NULL ) );
+		randValue = rand();
+	}while(randValue == 0);
+	sprintf(strTmp,"%03d",(unsigned int)randValue);
+	memcpy(strTrack3.grantControlCode+3,strTmp,3);
+*/
+	memcpy(strTrack3.expireDate,pdata->expireDate,sizeof(strTrack3.expireDate));
+	strTrack3.cardSerial = pdata->cardSerial;
+	memcpy(strTrack3.firstSubsidiaryAccount,pdata->masterAccount+6,10);
+	memcpy(strTrack3.appendData,pdata->oldRGCD,sizeof(pdata->oldRGCD));
+	strTrack3.checkNum[0]=getCheckNum(pdata->masterAccount,sizeof(pdata->masterAccount));
+	return Track23((char*)&strTrack2,(char*)&strTrack3,TRUE);
+}
+
+
+BOOL CARD::ISOINTERcodetrack1( char *data, char *name, char *parmTrack1)
+/*      国际借记卡一磁道专用
+ *      CaiJun
+ */
+{
+    INTER_TRACK0 *pdata;
+	char *pTrack1;
+	char namefmt[30];
+	int len;
+
+
+	pdata=(INTER_TRACK0 *)data;
+    pTrack1=parmTrack1;
+    memcpy(pTrack1,"B",1);
+	pTrack1+=1;
+	memcpy(pTrack1,pdata->masterAccount,sizeof(pdata->masterAccount));
+	pTrack1+=sizeof(pdata->masterAccount);
+    memcpy(pTrack1,"^",1);
+	pTrack1+=1;
+    strcpy(namefmt,name);
+	trimstr(namefmt);
+	strcat(namefmt,"/");
+	len=strlen(namefmt);
+    memcpy(pTrack1,namefmt,len);
+	pTrack1+=len;
+    memcpy(pTrack1,"^",1);
+	pTrack1+=1;
+    memcpy(pTrack1,pdata->expireDate,sizeof(pdata->expireDate));
+    pTrack1+=sizeof(pdata->expireDate);
+	memcpy(pTrack1,"1011234500",10);
+	pTrack1+=10;
+	memcpy(pTrack1,pdata->SVCD,3);
+	pTrack1+=3;
+    memcpy(pTrack1,"000000",6);
+	pTrack1+=6;
+    *pTrack1=0;
+    
+	return TRUE;
+}
+
+
+
+BOOL CARD::ISOINTERdecode( char *data,char* MARGType)
+{
+    INTER_TRACK0 *pdata;
+    INTER_TRACK2 strTrack2;
+    INTER_TRACK3 strTrack3;
+
+
+	data[0]=0;
+	if( !Track23((char*)&strTrack2,(char*)&strTrack3,FALSE,MARGType) )
+	    return FALSE;
+	pdata=(INTER_TRACK0 *)data;
+	memset((char*)pdata,'0',sizeof(INTER_TRACK0));
+	pdata->stringEnd=0;
+	
+	memcpy(pdata->masterAccount,strTrack2.masterAccount,sizeof(pdata->masterAccount));
+    pdata->cardSerial=strTrack3.cardSerial;
+	memcpy(pdata->SVCD,strTrack2.appendData+2,6);  //此处做了修改
+//	memcpy(pdata->SVCD,strTrack2.appendData+2,3);
+	memcpy(pdata->expireDate,strTrack3.expireDate,sizeof(strTrack3.expireDate));
+    memcpy(pdata->oldRGCD,strTrack3.appendData,sizeof(pdata->oldRGCD));
+	return TRUE;
+}
+
+BOOL CARD::ISONWPKcode( char *data)  //新系统存折
+{
+    NWPK_TRACK0 *pdata;
+    NWPK_TRACK2 strTrack2;
+    NWPK_TRACK3 strTrack3;
+
+    char defNWPKTrack2[]= "000000000000000\'00000000000000000";
+    char defNWPKTrack3[]= "60000000000000000\'156156500015100699\'00000000000\'0000000\'0000008130379181303791";
+
+	pdata=(NWPK_TRACK0 *)data;
+	strcpy((char*)&strTrack2,defNWPKTrack2);
+	strcpy((char*)&strTrack3,defNWPKTrack3);
+
+	memcpy(strTrack2.masterAccount,pdata->masterAccount,sizeof(pdata->masterAccount));
+	memcpy(strTrack2.PSBNBR,pdata->PSBNBR,sizeof(pdata->PSBNBR));
+	memcpy(strTrack2.SVCD,pdata->SVCD,sizeof(pdata->SVCD));
+    strTrack2.AccountChk=getCheckNum(pdata->masterAccount,sizeof(pdata->masterAccount));
+
+
+	memcpy(strTrack3.masterAccount,pdata->masterAccount,sizeof(pdata->masterAccount));
+	memcpy(strTrack3.PSBNBR,pdata->PSBNBR,sizeof(pdata->PSBNBR));
+	memcpy(strTrack3.SVCD,pdata->SVCD,sizeof(pdata->SVCD));
+    strTrack3.AccountChk=getCheckNum(pdata->masterAccount,sizeof(pdata->masterAccount));
+    strTrack3.PSBCHK=getCheckNum(pdata->PSBNBR,sizeof(pdata->PSBNBR));
+    strTrack3.CVCCHK=getCheckNum(pdata->SVCD,sizeof(pdata->SVCD));
+
+	return Track23((char*)&strTrack2,(char*)&strTrack3,TRUE);
+}
+
+
+BOOL CARD::ISONWPKdecode( char *data,char* MARGType)   //新系统存折
+{
+    NWPK_TRACK0 *pdata;
+    NWPK_TRACK2 strTrack2;
+    NWPK_TRACK3 strTrack3;
+
+
+
+	data[0]=0;
+	if( !Track23((char*)&strTrack2,(char*)&strTrack3,FALSE,MARGType) )
+	    return FALSE;
+	if ( strlen((char*)&strTrack3)!=sizeof(NWPK_TRACK3)-1)
+	    return FALSE;
+	pdata=(NWPK_TRACK0 *)data;
+	memset((char*)pdata,'0',sizeof(NWPK_TRACK0));
+	pdata->stringEnd=0; 
+
+	memcpy(pdata->masterAccount,strTrack3.masterAccount,sizeof(pdata->masterAccount));
+	memcpy(pdata->PSBNBR,strTrack3.PSBNBR,sizeof(pdata->PSBNBR));
+	memcpy(pdata->SVCD,strTrack3.SVCD,sizeof(pdata->SVCD));
+
+	return TRUE;
+}
+
+
+BOOL CARD::ISONWUScode( char *data)  //新系统用户卡
+{
+    NWUS_TRACK0 *pdata;
+    NWUS_TRACK2 strTrack2;
+    NWUS_TRACK3 strTrack3;
+
+    char defNWUSTrack2[]= "000000\'00000000";
+    char defNWUSTrack3[]= "70000000\'5000060106990\'0000000\'0000008130379181303791";
+
+	pdata=(NWUS_TRACK0 *)data;
+	strcpy((char*)&strTrack2,defNWUSTrack2);
+	strcpy((char*)&strTrack3,defNWUSTrack3);
+
+	memcpy(strTrack2.USRNBR,pdata->USRNBR,sizeof(pdata->USRNBR));
+	strTrack2.cardSerial=pdata->cardSerial;
+	memcpy(strTrack2.SVCD,pdata->SVCD,sizeof(pdata->SVCD));
+    strTrack2.USRCHK=getCheckNum(pdata->USRNBR,sizeof(pdata->USRNBR));
+
+
+	memcpy(strTrack3.USRNBR,pdata->USRNBR,sizeof(pdata->USRNBR));
+	strTrack3.cardSerial=pdata->cardSerial;
+	memcpy(strTrack3.SVCD,pdata->SVCD,sizeof(pdata->SVCD));
+    strTrack3.USRCHK=getCheckNum(pdata->USRNBR,sizeof(pdata->USRNBR));
+    strTrack3.CVCCHK=getCheckNum(pdata->SVCD,sizeof(pdata->SVCD));
+
+	return Track23((char*)&strTrack2,(char*)&strTrack3,TRUE);
+}
+
+
+BOOL CARD::ISONWUSdecode( char *data,char* MARGType)   //新系统用户卡
+{
+    NWUS_TRACK0 *pdata;
+    NWUS_TRACK2 strTrack2;
+    NWUS_TRACK3 strTrack3;
+
+
+
+	data[0]=0;
+	if( !Track23((char*)&strTrack2,(char*)&strTrack3,FALSE,MARGType) )
+	    return FALSE;
+	if ( strlen((char*)&strTrack3)!=sizeof(NWUS_TRACK3)-1)
+	    return FALSE;
+	pdata=(NWUS_TRACK0 *)data;
+	memset((char*)pdata,'0',sizeof(NWUS_TRACK0));
+	pdata->stringEnd=0; 
+
+	memcpy(pdata->USRNBR,strTrack3.USRNBR,sizeof(pdata->USRNBR));
+	pdata->cardSerial=strTrack3.cardSerial;
+	memcpy(pdata->SVCD,strTrack3.SVCD,sizeof(pdata->SVCD));
+
+	return TRUE;
+}
+
+BOOL CARD::CMBcode( char * type, char * data, char* MagData)
+{
+	BOOL Ret;
+
+////////////////////////////////
+// data struct
+
+// 1. ODPK  存折
+// 0..3		Region Code (RGCD)
+// 4..13	Account No  (ACNO)
+// 14..21	Passbook    (PSBK)
+// 22..27   SVCD        (SVCD)
+// total:28
+//
+// 2. ODCD  旧一卡通
+// 0..3		Region Code (RGCD)
+// 4..11	Customer No (CUNO)
+// 12..13   99          (99) 
+// 14..21	passbook    (PSBK)
+// 22..27   SVCD        (SVCD)
+// total:28
+//
+// 3.NWCD 新一卡通
+// 0..15    卡号        (EACNBR)
+// 16..16   卡序号      (PSBSEQ) 
+// 17..22   SVCD        (CVCCOD)
+// 23..26   Region Code (REGCOD) 
+// 27..30   有效期      (EXPDAT)
+// total 31
+//
+// 4.HKCD 香港一卡通
+// 0..15    卡号        (EACNBR)
+// 16..16   卡序号      (PSBSEQ)
+// 17..22   SVCD        (CVCCOD) 
+// 23..26   Region Code (REGCOD) 
+// 27..30   有效期      (EXPDAT) 
+// 31..31   语言标志    (语言标志)
+// 32..32   校验位      (校验位)
+// 33..37   PIN偏移量   (PIN偏移量)
+// total 38
+//
+// 5.NWPK 新系统存折
+// 0..14    存折号 (EACNBR)
+// 15..24   凭证号 (PSBNBR)
+// 25..30   SVCD   (CVCCOD)
+// total 31
+//
+// 6.NWUS 新系统用户卡
+// 0..5   用户号 (USRNBR)
+// 6..6   卡序号 (PSBSEQ)
+// 7..12  SVCD   (CVCCOD)
+// total 13
+
+// 7.INTE 国际借记卡
+// 0..15    卡号        (EACNBR)
+// 16..16   卡序号      (PSBSEQ) 
+// 17..22   SVCD        (CVCCOD)
+// 23..26   Region Code (REGCOD) 
+// 27..30   有效期      (EXPDAT)
+// total 31
+	
+// 8.ICCD IC磁条卡 zhanglei 20100919
+// 0..18    卡号        (EACNBR)
+// 16..16   卡序号      (PSBSEQ) 
+// 17..22   SVCD        (CVCCOD)
+// 23..26   Region Code (REGCOD) 
+// 27..30   有效期      (EXPDAT)
+// total 34
+
+// 9.HKIC HK IC磁条卡 zhanglei 20110721
+// 同HKCD,服务代码为220
+
+	Ret=false;
+	MagData[0]=0;
+
+	if (strcmp(type,"ODCD")==0)
+	{
+      Ret=ISOcode(data);
+	}
+	else if (strcmp(type,"ODPK")==0)
+	{
+      ISOcode(data);
+	  Ret=true;
+	}
+	else if (strcmp(type,"NWCD")==0)
+	{
+      Ret=ISONewcode(data);
+	}
+	else if (strcmp(type,"HKCD")==0)
+	{
+      Ret=ISOHKcode(data);
+	}
+	else if (strcmp(type,"HKIC")==0)
+	{
+      Ret=ISOHKcode_help(data, TRUE);
+	}
+	else if (strcmp(type,"INTE")==0)
+	{
+      Ret=ISOINTERcode(data);
+	}
+	else if (strcmp(type,"NWPK")==0)
+	{
+      Ret=ISONWPKcode(data);
+	}
+	else if (strcmp(type,"NWUS")==0)
+	{
+      Ret=ISONWUScode(data);
+	}
+	else if (strcmp(type,"ICCD")==0)
+	{
+      Ret=ICcode(data);
+	}
+
+    if (Ret)
+	{
+		  strcpy(MagData,trackData);
+	}
+	return Ret;
+}
+
+BOOL CARD::CMBdecode( char* MagData, char * type, char * data)
+{
+// CRED   招行信用卡
+// 0..15  卡号 (EACNBR)
+// 16..47  二磁道 (TK2DTA)
+// total 48
+
+	BOOL Ret;
+	char strTrack2[250], strTrack3[250];
+	int  lenTrack2, lenTrack3;
+
+    Ret=false;
+	data[0]=0;
+	type[0]=0;
+    
+	strcpy(trackData,MagData);
+
+	Track23(strTrack2,strTrack3,false);
+
+	lenTrack2=strlen((char*)&strTrack2);
+	lenTrack3=strlen((char*)&strTrack3);
+
+	//4-VISA,5-MASTER,6-银联,3-JCB
+	if ( ( lenTrack2==sizeof(IC_TRACK2)-1 ) &&
+              ( lenTrack3==sizeof(IC_TRACK3)-1 ) &&
+		      ( strncmp((char*)&strTrack3,"99620520",8)==0 ) )
+	{
+		Ret=ICdecode(data);
+		if (Ret)
+		{  strcpy(type,"ICCD");
+		}
+	}
+	else if ( ( lenTrack2==sizeof(NEW1_TRACK2)-1 ) &&
+         ( lenTrack3==sizeof(NEW_TRACK3)-1 ) &&
+		 ( strncmp((char*)&strTrack3,"996",3)==0 ) )
+	{
+		Ret=ISONewdecode(data);
+		if (Ret)
+		{  strcpy(type,"NWCD");
+		}
+	}
+	else if ( ( lenTrack2==sizeof(NEW_TRACK2)-1 ) &&
+              ( lenTrack3==sizeof(NEW_TRACK3)-1 ) &&
+		      ( strncmp((char*)&strTrack3,"999555",6)==0 ) )
+	{
+		Ret=ISONewdecode(data);
+		if (Ret)
+		{  strcpy(type,"NWCD");
+		}
+	}
+	else if( ( lenTrack2==sizeof(HK_TRACK2)-1) && 
+		     ( lenTrack3==sizeof(HK_TRACK3)-1) &&
+		     ( strncmp((char*)&strTrack3,"92",2)==0 ) )
+    {
+		BOOL isIC;
+		Ret=ISOHKdecode_help(data, "23", &isIC);
+		if (Ret)
+		{  
+			if (isIC == TRUE)
+				strcpy(type, "HKIC");
+			else
+				strcpy(type,"HKCD");
+		}
+	}
+	else if( ( lenTrack2==sizeof(INTER_TRACK2)-1) && 
+		     ( lenTrack3==sizeof(INTER_TRACK3)-1) &&
+			 ( ( strncmp((char*)&strTrack3,"994",3)==0 ) 
+			   ||( strncmp((char*)&strTrack3,"995",3)==0 ) ) )
+    {
+		Ret=ISOINTERdecode(data);
+		if (Ret)
+		{  strcpy(type,"INTE");
+		}
+	}
+	else if ( lenTrack2==sizeof(NEW_CREDIT_TRACK2)-1 &&
+		( lenTrack3<16 || lenTrack3 == 104 ) )
+    {
+		memcpy(data,strTrack2,16);
+		data[16]=0;
+		strcat(data,strTrack2);
+        strcpy(type,"CRED");
+		Ret=true;
+	}
+	else if ( ( lenTrack2==37 ) &&
+		      ( lenTrack3 == 104) &&
+			  ( strncmp((char*)&strTrack3,"993",3)==0 )  )
+	{
+		// New JCB Credit Card
+		memcpy(data,strTrack2,16);
+		data[16]=0;
+		strcat(data,strTrack2);
+        strcpy(type,"CRED");
+        //  AE Card 
+        if (( data[15]=='\'') || (data[15]=='\=' ))
+		{   data[15]=' ';
+		}
+		Ret=true;
+	}
+	else if ( ( lenTrack2==37 ) &&
+		      ( lenTrack3<16 ) &&
+			  ( strncmp((char*)&strTrack2,"3",1)==0 )  )
+	{
+		// New JCB Credit Card
+		memcpy(data,strTrack2,16);
+		data[16]=0;
+		strcat(data,strTrack2);
+        strcpy(type,"CRED");
+        //  AE Card 
+        if (( data[15]=='\'') || (data[15]=='\=' ))
+		{   data[15]=' ';
+		}
+		Ret=true;
+	}
+	else if( ( lenTrack2==sizeof(NWPK_TRACK2)-1) && 
+		     ( lenTrack3==sizeof(NWPK_TRACK3)-1) && 
+		     ( strncmp((char*)&strTrack3,"60",2)==0 ) )
+    {
+		Ret=ISONWPKdecode(data);
+		if (Ret)
+		{  strcpy(type,"NWPK");
+		}
+	}
+	else if( ( lenTrack2==sizeof(NWUS_TRACK2)-1) && 
+		     ( lenTrack3==sizeof(NWUS_TRACK3)-1) && 
+		     ( strncmp((char*)&strTrack3,"70",2)==0 ) )
+    {
+		Ret=ISONWUSdecode(data);
+		if (Ret)
+		{  strcpy(type,"NWUS");
+		}
+	}
+	else if( ( (lenTrack2==35)&&(lenTrack3==97) )|| (lenTrack2==37)&&(lenTrack3==100) )
+	{
+		Ret=ISOdecode( data);
+		if (Ret)
+		{
+			if ((data[12]=='9') && (data[13]=='9'))
+			{   strcpy(type,"ODCD");
+			}
+			else
+			{   strcpy(type,"ODPK");
+			}
+
+		}
+	}
+    return Ret;
+}
+
+
+
+BOOL CARD::CMBcodeEx( char * type, char * data, char* MagData)
+{
+	BOOL Ret;
+	char MagDataBuf[TRACK_DATA_LEN];
+	char *ptmp;
+	char *pDivide;
+
+	char MagDataBuf1[TRACK_DATA_LEN];
+	char name[50];
+
+
+    MagData[0]=0;
+	Ret=CMBcode(type,data,MagDataBuf);
+	if (!Ret) return Ret;
+
+ 	pDivide=strstr(MagDataBuf,"A");
+    if (pDivide!=NULL)
+	{
+		memmove(pDivide+2,pDivide,strlen(pDivide)+1);
+		memcpy(pDivide,"?_;",3);
+	}
+    ptmp=MagDataBuf;
+	while( *ptmp!=0)
+	{
+		if(*ptmp=='\'') *ptmp='=';
+		ptmp++;
+	}
+//	strcpy(MagData,MagDataBuf); //改为内部处理
+	if (strcmp(type,"INTE")==0) //国际卡
+	{
+		strcpy(name,data+sizeof(INTER_TRACK0)-1);
+        Ret=ISOINTERcodetrack1(data,name,MagDataBuf1);
+		if (!Ret) return Ret;
+        sprintf(MagData,"%%%s?;%s!",MagDataBuf1,MagDataBuf);      
+	}
+	else
+	{
+		sprintf(MagData,";%s?",MagDataBuf); 
+	}
+    return Ret;
+}
+
+BOOL CARD::CMBdecodeEx( char* MagData, char * type, char * data)
+{
+	BOOL Ret;
+	char MagDataBuf[TRACK_DATA_LEN];
+	char *ptmp;
+	char *pDivide;
+
+ 	strcpy(MagDataBuf,MagData);
+ 	pDivide=strstr(MagDataBuf,"?_;");
+    if (pDivide!=NULL)
+	{
+		memmove(pDivide,pDivide+2,strlen(pDivide+2)+1);
+		memcpy(pDivide,"A",1);
+	}
+    ptmp=MagDataBuf;
+	while( *ptmp!=0)
+	{
+		if(*ptmp=='=') *ptmp='\'';
+		ptmp++;
+	}
+	Ret=CMBdecode(MagDataBuf,type,data);
+    return Ret;
+}
+
+
+BOOL CARD::Othdecode( char* MagData, char * type, char * data)
+{
+	BOOL Ret;
+	char strTrack2[250], strTrack3[250];
+	char *pmag;
+	int cnt;
+
+    Ret=false;
+	data[0]=0;
+	type[0]=0;
+    
+	strcpy(trackData,MagData);
+	Track23(strTrack2,strTrack3,false);
+
+    pmag=strTrack2;
+	cnt=0;
+
+	while ( *pmag!=0 )
+	{
+		if ( (*pmag=='\'') || (*pmag=='=') ) break;
+		pmag++;
+		cnt++;
+	}
+
+    if (cnt>0) 
+	{
+	    memcpy(data, strTrack2,cnt);
+	    data[cnt]=0;
+        strcpy(type,"OTHR");
+		Ret=true;
+	}
+
+	return Ret;
+}
+
+void CARD::LoadFromFile()
+{
+	m_BinSvcCod.clear();
+#ifdef linux
+	return;
+#else
+	char szPath[MAX_PATH];
+	GetModuleFileName(NULL,szPath,MAX_PATH);
+	string strPath = string(szPath);
+	string fullpath = strPath.substr(0,strPath.find_last_of("\\"))+"\\BinSvcCode.dat";
+	ifstream fin(fullpath.c_str());
+
+	if(!fin.is_open())
+		return;
+	while(!fin.eof())
+	{
+		string line;
+		getline(fin, line,'\n');
+		int pos = line.find("=");
+		if (pos == string::npos)
+		{
+			continue;
+		}
+		m_BinSvcCod[line.substr(0,pos)] = line.substr(pos+1);
+	}
+	fin.close();
+#endif
+}
+
+string CARD::GetSvcCod(string key)
+{	
+	if (m_BinSvcCod.find(key) != m_BinSvcCod.end())
+	{
+		return m_BinSvcCod[key];
+	} 
+	return "";	
+}
+
+//oilyang@20201022 add
+CMB_CARD_TRACK_API bool CMBdecodeMag2(char* Mag2Data, char * data)
+{
+	//g_pCard delete or not?
+	if (g_pCard == NULL)
+		g_pCard = new CARD();
+	//oiltest new exception
+	if (g_pCard == NULL)
+		return false;
+	return g_pCard->CMBdecodeMag2(Mag2Data,data);
+}
+CMB_CARD_TRACK_API bool CMBdecodeEx(char* MagData, char * type, char * data)
+{
+	if (g_pCard == NULL)
+		g_pCard = new CARD();
+	//oiltest new exception
+	if (g_pCard == NULL)
+		return false;
+	return g_pCard->CMBdecodeEx(MagData,type,data);
+}