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

📄 ic_card.c

📁 金融IC卡读写器函数
💻 C
📖 第 1 页 / 共 3 页
字号:
//	}	memcpy(SendCommand + 10, pstmacdata.trade_no, 2); //	memcpy(temp, &trade_no, 2);//	for(i = 0; i < 2; i++)//	{//		SendCommand[10+i] = temp[1-i];//	}	memset(money1,0x00,sizeof(money1));	Dec2Hex(trademoney,money1);	sscanf(money1,"%08X",&money);	memset(temp,0x00,sizeof(temp));	memcpy(temp, &money, 4); 	for(i = 0; i < 4; i++)	{		printf("%02X", temp[3-i]);		SendCommand[12+i] = temp[3-i];	}	for(i = 0; i < 1; i++)	{		SendCommand[16+i] = trade_money[i];	}	memset(day1,0x00,sizeof(day1));	Dec2Hex(tradeday,day1);	sscanf(day1,"%08X",&day);	memset(temp,0x00,sizeof(temp));	memcpy(temp, &day, 4); 	for(i = 0; i < 4; i++)	{		printf("%02X", temp[4-i]);		SendCommand[17+i] = temp[4-i];	}	memset(time1,0x00,sizeof(time1));	Dec2Hex(tradetime,time1);	sscanf(time1,"%06X",&time);	memset(temp,0x00,sizeof(temp));	memcpy(temp, &time, 3); 	for(i = 0; i < 3; i++)	{		printf("%02X", temp[3-i]);		SendCommand[21+i] = temp[3-i];	}	memcpy(SendCommand+24,pstmacdata.mac_version,1);	printf("the mac_version is ....[%02X]....\n",pstmacdata.mac_version[0]);	memcpy(SendCommand+25,pstmacdata.arith_no,1);	memcpy(SendCommand+26,pstmacdata.consumer_id,8);	memcpy(SendCommand+34, pstmacdata.bank_id, 2);	memcpy(SendCommand+36,"\xFF\xFF\xFF\xFF\xFF\xFF",6);		memcpy(SendCommand+42,pstmacdata.city_id,2);	SendCommand[43]=SendCommand[43]|15;	memcpy(SendCommand+44,"\xFF\xFF\xFF\xFF\xFF\xFF", 6);	sendlen = 50;	printf("Send Read Record\n");	ret = SendCmd(SendCommand, sendlen, (unsigned char *)recvbuf, &recvlen);	if(recvbuf[1] == 0x61)	{		sprintf((char *)SendCommand, "%c%c%c%c%c%c", 0x1b, 0x00, 0xC0, 0x00, 0x00,recvbuf[2]);		SendCmd(SendCommand, 6, (unsigned char *)recvbuf, &recvlen);		ptr = recvbuf+1;		memset(temp, 0x00, sizeof(temp));		memcpy(temp, ptr, 4);		for(i = 0; i < 4; i++)		{			printf("%02X", temp[i]);			sprintf(term_tradeno+i*2, "%02X", temp[i]);		}		printf("the term_tradeno is [%s]\n",term_tradeno);		memset(temp, 0x00, sizeof(temp));		memcpy(temp, ptr+4, 4);		for(i = 0; i < 4; i++)		{			printf("%02X", temp[i]);			sprintf(mac1+i*2, "%02X", temp[i]);		}		printf("the mac1 is [%s]\n",mac1);	}	printf("-------PsamCreatMac122-------\n"); 	for(k=0;k<4;k++)	printf("%X",pstmacdata.random[k]);	printf("\n");	return 0; } //执行消费交易int PbocCreditPurchase(unsigned char mode, char *trademoney,char *mac1,char *mac2,char *term_tradeno,stMACDATA *pstmacdata,char *tradeday,char *tradetime){	unsigned char  SendCommand[128];	unsigned char  recvlen = 0;	char     recvbuf[256];	int      sendlen;	unsigned int termtradeno;	unsigned int mac;	unsigned int time;	unsigned int day;	char time1[10];	char day1[10];	short  ret;	char temp[14];	int i,k;	char *ptr;/*	char term_tradetime[4];// 终端交易计数器	char tradeday[5];      // 交易日期	char tradetime[5];     // 交易时间	char tac[5];           // TAC*/		if(mode !=0x01 && mode != 0x02)	{	    return -1;	}		printf("-------PbocCreditPurchase11-------\n"); 	for(k=0;k<4;k++)		printf("%X",*(pstmacdata->random+k));	printf("\n");	memset((char *)SendCommand, 0x00, sizeof(SendCommand));	sprintf((char *)SendCommand, "%c%c%c%c%c%c", 0x14, 0x80, 0x54, 0x01, 0x00, 0x0f);	sscanf(term_tradeno, "%08X", &termtradeno);	sscanf(mac1, "%08X", &mac);	memcpy(temp, &termtradeno, 4); 	for(i = 0; i < 4; i++)	{		SendCommand[6+i] = temp[3-i];	}	memcpy(pstmacdata->term_tradetime, SendCommand+6, 4);	memset(day1,0x00,sizeof(day1));	Dec2Hex(tradeday,day1);	sscanf(day1,"%08X",&day);	memset(temp,0x00,sizeof(temp));	memcpy(temp, &day, 4); 	for(i = 0; i < 4; i++)	{		printf("%02X", temp[4-i]);		SendCommand[10+i] = temp[4-i];	}	memcpy(pstmacdata->tradeday, SendCommand+10, 4);	memset(time1,0x00,sizeof(time1));	Dec2Hex(tradetime,time1);	sscanf(time1,"%06X",&time);	memset(temp,0x00,sizeof(temp));	memcpy(temp, &time, 3); 	for(i = 0; i < 3; i++)	{		printf("%02X", temp[3-i]);		SendCommand[14+i] = temp[3-i];	}	memcpy(pstmacdata->tradetime, SendCommand+14, 3);	printf("the mac1 is ....[%s]....\n",mac1);	memset(temp,0x00,sizeof(temp));	memcpy(temp, &mac, 4); 	for(i = 0; i < 4; i++)	{		SendCommand[17+i] = temp[3-i];	}		sendlen = 21;	printf("Send Credit for Purchase\n");	ret = SendCmd(SendCommand, sendlen, (unsigned char *)recvbuf, &recvlen);	if( ret )		return ret;	if(recvbuf[1] == 0x61)	{		sprintf((char *)SendCommand, "%c%c%c%c%c%c", 0x13, 0x00, 0xC0, 0x00, 0x00, recvbuf[2]);		SendCmd(SendCommand, 6, (unsigned char *)recvbuf, &recvlen);		ptr = recvbuf+1;		memset(temp, 0x00, sizeof(temp));		memcpy(pstmacdata->tac, ptr, 4);		memcpy(temp, ptr+4, 4);		for(i = 0; i < 4; i++)		{			printf("%02X", temp[i]);			sprintf(mac2+i*2, "%02X", temp[i]);		}		printf("the mac2 is [%s]\n",mac2);		return 0;	}	printf("-------PbocCreditPurchase22-------\n"); 	for(k=0;k<4;k++)		printf("%X",*(pstmacdata->random+k));	printf("\n");	return -1;}//校验MAC2int PsamVerifyMac2(char *mac2){	unsigned char  SendCommand[128];	unsigned char  recvlen = 0;	char     recvbuf[256];	int      sendlen;	unsigned int temp_mac;	char temp[20];	static unsigned char SAM_POWER_DOWN[]={0x19};	int i;	short  ret;		memset((char *)SendCommand, 0x00, sizeof(SendCommand));	sprintf((char *)SendCommand, "%c%c%c%c%c%c", 0x1c, 0x80, 0x72, 0x00, 0x00, 0x04);	sscanf(mac2, "%08X", &temp_mac);	memcpy(temp, &temp_mac, 4); 	for(i = 0; i < 4; i++)	{		SendCommand[6+i] = temp[3-i];	}	sendlen = 10;	printf("Send verify Mac2\n");	ret = SendCmd(SendCommand, sendlen, (unsigned char *)recvbuf, &recvlen);	if( ret )		return ret;	if(recvbuf[1] == 0x61)	{		sprintf((char *)SendCommand, "%c%c%c%c%c%c", 0x13, 0x00, 0xC0, 0x00, 0x00, recvbuf[2]);		SendCmd(SendCommand, 6, (unsigned char *)recvbuf, &recvlen);	}	SendCmd( SAM_POWER_DOWN, sizeof( SAM_POWER_DOWN ), (unsigned char *)recvbuf, &recvlen) ;	return 0;}//读取后续文件short PsamReadRecord(char head, short readmode, short sfi, short recno, short reclen, char *recvbuf){	unsigned char  recvlen = 0;	unsigned char  datalen;	int sendlen;	unsigned char SendCommand[128];	short  ret, p2;	p2 = ( sfi << 3 ) | readmode;	memset((char *)SendCommand, 0x00, sizeof(SendCommand));	sprintf((char *)SendCommand, "%c%c%c%c%c%c", head, 0x00, 0xB2, recno, p2, reclen);	sendlen = 6;	printf("Send Read Record\n");	ret = SendCmd(SendCommand, sendlen, (unsigned char *)recvbuf, &recvlen);	if(recvbuf[1] == 0x6C || recvbuf[1] == 0x61)	{		datalen = recvbuf[2] & 0XFF;		return PsamReadRecord(0x1b, readmode, sfi, recno, datalen, recvbuf);	}	return 0;}//获取消费信息                                                                                                                                                                                                                                                                            int GetSamInfo(char *recvbuf, stMACDATA *pstmacdata){	int  i,k;	char startday[10], endday[10];	char temp[50];	char *ptr;	printf("-------GetSamInfo11-------\n"); 	for(k=0;k<4;k++)		printf("%X",*(pstmacdata->random+k));	printf("\n");	memset(temp, 0x00, sizeof(temp));	memset(startday, 0x00, sizeof(startday));	memset(endday, 0x00, sizeof(endday));	if(recvbuf[0] != 0x00)		return -1;	if(recvbuf[1] != 0x6f)              // FCI 模板		return -2;	printf("FCI:[%02X]\n", recvbuf[2]);	if(recvbuf[3] != 0x84)              // DF 名		return -3;	memcpy(temp, recvbuf+5, recvbuf[4]);	printf("DF name:\n");	for(i = 0; i < recvbuf[4]; i++)	{		printf("%02X ", temp[i]);	}	printf("\n");	ptr = recvbuf + recvbuf[4] + 5;	if(ptr[0] != 0xa5)                  // FCI 专用数据		return -4;	printf("FCI Special Data:[%02X]\n", ptr[1]);	ptr += 2;	if(ptr[0] == 0x9f && ptr[1] == 0x0c)// 发送方自定义数据 FCI	{		printf("Sender self define fci:[%02x]\n", ptr[2]);	}	else		return -5;	ptr +=3;	memcpy(pstmacdata->mac_index,ptr,1);	ptr += 11;	printf("-------GetSamInfo22-------\n"); 	for(k=0;k<4;k++)		printf("%X",*(pstmacdata->random+k));	printf("\n");	return 0;}int PbocInitForLoad(unsigned char mode, char *trademoney,stMACDATA *pstmacdata){	unsigned char  SendCommand[128];	unsigned char  recvlen = 0;	char     recvbuf[256];	int      sendlen;	short  ret;	char *ptr;	char temp[50];	int i;	char money1[20];	unsigned int money;		if(mode !=0x01 && mode != 0x02)	{	    return -1;	}		memset((char *)SendCommand, 0x00, sizeof(SendCommand));	sprintf((char *)SendCommand, "%c%c%c%c%c%c", 0x14, 0x80, 0x50, 0x00, mode, 0x0b);	memcpy(SendCommand+6,pstmacdata->mac_index,1);	//printf("the trade money is [%s]\n",trademoney);	Dec2Hex(trademoney,money1);	sscanf(money1,"%08X",&money);	memcpy(temp, &money, 4); 	for(i = 0; i < 4; i++)	{		printf("%02X", temp[3-i]);		SendCommand[7+i] = temp[3-i];	}	memcpy(pstmacdata->amount, SendCommand+7, 4);	memcpy(SendCommand+11,pstmacdata->term_no,6);	sendlen = 17;	printf("Send Initialize for Load\n");	ret = SendCmd(SendCommand, sendlen, (unsigned char *)recvbuf, &recvlen);	if( ret )		return ret;	if(recvbuf[1] == 0x61)	{		sprintf((char *)SendCommand, "%c%c%c%c%c%c", 0x13, 0x00, 0xC0, 0x00, 0x00, recvbuf[2]);		SendCmd(SendCommand, 6, (unsigned char *)recvbuf, &recvlen);		ptr = recvbuf+1;		memset(temp, 0x00, sizeof(temp));		memcpy(temp, ptr, 4);		memcpy(pstmacdata->balance, temp, 4);         // ED或EP余额/*		printf("balance: ");		for(i = 0; i < 4; i++)		{			printf("%02x ", pstmacdata->balance[i]);		}*/		memcpy(pstmacdata->trade_no, ptr+4, 2);       // ED或EP联机交易序号/*		printf("\ntrade_no: ");		for(i = 0; i < 2; i++)		{			printf("%02x ", pstmacdata->trade_no[i]);		}*/		memcpy(pstmacdata->mac_version, ptr+6, 1);/*		printf("\nmac_version: ");		for(i = 0; i < 1; i++)		{			printf("%02x ", pstmacdata->mac_version[i]);		}*/		memcpy(pstmacdata->arith_no, ptr+7, 1);/*		printf("\narith_no: ");		for(i = 0; i < 1; i++)		{			printf("%02x ", pstmacdata->arith_no[i]);		}*/		memcpy(pstmacdata->random, ptr+8, 4);/*		printf("\nrandom: ");		for(i = 0; i < 4; i++)		{			printf("%02x ", pstmacdata->random[i]);		}*/		memcpy(pstmacdata->mac1, ptr+12, 4);/*		printf("\nmac1: ");		for(i = 0; i < 4; i++)		{			printf("%02x ", pstmacdata->mac1[i]);		}*/	}	return 0;}    int PbocCreditForLoad(unsigned char mode, char *tradeday,char *tradetime,char *mac2){	unsigned char  SendCommand[128];	unsigned char  recvlen = 0;	char     recvbuf[256];	int      sendlen;	short  ret;//	unsigned long mac;//	unsigned long time;//	unsigned long day;//	char time1[10];//	char day1[10];//	char temp[14];//	int i;//	char *ptr;		if(mode !=0x01 && mode != 0x02)	{	    return -1;	}		memset((char *)SendCommand, 0x00, sizeof(SendCommand));	sprintf((char *)SendCommand, "%c%c%c%c%c%c", 0x14, 0x80, 0x52, 0x00, 0x00, 0x0b);	memcpy(SendCommand+6, tradeday, 4);	memcpy(SendCommand+10, tradetime, 3);	memcpy(SendCommand+13, mac2, 4);//	memset(day1,0x00,sizeof(day1));//	Dec2Hex(tradeday,day1);//	sscanf(tradeday,"%08X",&day);//	memset(temp,0x00,sizeof(temp));//	memcpy(temp, &day, 4);//	printf("tradeday[ ");//	for(i = 0; i < 4; i++)//	{//		printf("%02X", temp[4-i]);//		SendCommand[6+i] = temp[4-i];//	}//	printf("]\ntradetime[");//	memset(time1,0x00,sizeof(time1));//	Dec2Hex(tradetime,time1);//	sscanf(tradetime,"%06X",&time);//	memset(temp,0x00,sizeof(temp));//	memcpy(temp, &time, 3); //	for(i = 0; i < 3; i++)//	{//		printf("%02X", temp[3-i]);//		SendCommand[10+i] = temp[3-i];//	}//	printf("]\n");//	sscanf(mac2, "%08X", &mac);//	memset(temp,0x00,sizeof(temp));//	memcpy(temp, &mac, 4); //	for(i = 0; i < 4; i++)//	{//		SendCommand[13+i] = temp[3-i];//	}		sendlen = 17;	printf("Send Credit for Load\n");	ret = SendCmd(SendCommand, sendlen, (unsigned char *)recvbuf, &recvlen);	if( ret )		return ret;	if(recvbuf[1] == 0x61)	{		sprintf((char *)SendCommand, "%c%c%c%c%c%c", 0x13, 0x00, 0xC0, 0x00, 0x00, recvbuf[2]);		SendCmd(SendCommand, 6, (unsigned char *)recvbuf, &recvlen);	}	return 0;}   //返回0表示处理正常,返回-1表示超过处理长度int Dec2Hex(char *dec,char *hex){	long int i;    //用于存放将字符串转成的整数	int j;         //存放临时左移的4位数值	int k;         //用于记录当前存放的16进制位数	char ch;       //当前的16进制字符	char tmphex[ARRLENGTH];     	k = ARRLENGTH-1;  //从后向前填写.第20个字符作为字符串结束符号	memset(tmphex,0,ARRLENGTH);     	i = atoi(dec);//	printf("原始十进制数据:%ld\n",i);	while(1)	{		if(i>15)		{			k = k-1;        //先执行减1,处理逻辑更容易			if(k==0 && i>0)				break;  //超长			j = i % 16;			i = i / 16;			ch = Dec2HexChar(j);    //取得当前字符的16进制形式//			printf("当前字符:%d  %d  %c\n",i,j,ch);			tmphex[k] = ch;         //将字符放置到正确位置		}		else		{       //最后一个16进制			if(i==0)				return k;			k = k-1;			ch = Dec2HexChar(i);			tmphex[k] = ch;			break;		}	}     //	printf("转换后的十六进制数据:%s  k=%d\n",tmphex+k,k);	memcpy(hex,tmphex+k,ARRLENGTH-k-1);	return k;}int Dec2HexChar(int j){	switch(j)	{		case 0:  return '0'; break;		case 1:  return '1'; break;		case 2:  return '2'; break;		case 3:  return '3'; break;		case 4:  return '4'; break;		case 5:  return '5'; break;		case 6:  return '6'; break;		case 7:  return '7'; break;		case 8:  return '8'; break;		case 9:  return '9'; break;		case 10: return 'A'; break;		case 11: return 'B'; break;		case 12: return 'C'; break;		case 13: return 'D'; break;		case 14: return 'E'; break;		case 15: return 'F'; break;	}	return 0;}

⌨️ 快捷键说明

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