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

📄 globalfunc.cpp

📁 视频芯片管理系统
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "GlobalFunc.h"
#include "DogMgt_Base.h"
#include "Error.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

extern void HideProgressInfo();
extern int MyMessageBox(LPCTSTR lpszText, LPCTSTR lpszCaption, UINT nType = MB_OK);

///显示消息
void ShowMsg(char msg[])
{
	HideProgressInfo();
	MyMessageBox(msg, "消息", MB_ICONINFORMATION);
}

///显示时间
void ShowDateTime(unsigned char dt[]/*7 characters*/)
{
	char buf[100];
	int y, m, d, h, mi, s;
	bcd2greg(dt, y, m, d);
	h = (dt[4]>>4) * 10 + (dt[4]&0xF);
	mi = (dt[5]>>4) * 10 + (dt[5]&0xF);
	s = (dt[6]>>4) * 10 + (dt[6]&0xF);

	sprintf(buf, "当前时间:%d年%d月%d日%d时%d分%d秒\n", y, m, d, h, mi, s);
	HideProgressInfo();
	MyMessageBox(buf, "时间显示", MB_ICONINFORMATION);
}

///将BCD串转化为字符串
/**
  * bcd : 待转换的BCD串 \n
  * str : 返回转换完毕的字符串 \n
  * len : BCD串的长度,即字节数 \n
  * 注意 : 需确保str的大小至少为2*len+1,输出包含结尾符
  */
void	Bcd2Str(const uchar *bcd,char *str,int len)
{
	int	i;
	uchar	uc;

	for(i=0;i<len;i++){
		uc=bcd[i]&0x0f;
		str[i*2+1]=uc+0x30;
		uc=(bcd[i]&0xf0)/16;
		str[i*2]=uc+0x30;
	}
	str[2*i]='\0';
}

///将字符串转化为BCD串
/**
  * str : 待转换的STR串 \n
  * bcd : 返回转换后的BCD串 \n
  * len : STR串的长度,即字节数 \n
  * 注意 : 需确保bcd的大小至少为(len+1)/2+1
  */
void	Str2Bcd(const char *str ,uchar *bcd,int len)
{
	uchar	uc;
	ushort	len1;
	int	i;

	len1=(len+1)>>1;
	for(i=0;i<len1;i++){
		uc=(str[2*i]-0x30)<<4;
		uc+=str[2*i+1]-0x30;
		bcd[i]=uc;
	}
}

/**
 * Converts a Gregorian date to a Julian day. \n
 * This algorithm is taken from Communications of the ACM, Vol 6, No 8. \n
 * y:  year \n
 * m:  month of year \n
 * d:  day of month
 */
unsigned int greg2jul( int y, int m, int d )
{
	uint c, ya;
	if ( y <= 99 ){
		y += 1900;
	}
	if ( m > 2 ) {
		m -= 3;
	}
	else {
		m += 9;
		y--;
	}
	c = y;                                      // NOTE: Sym C++ 6.0 bug
	c /= 100;
	ya = y - 100*c;
	return 1721119 + d + (146097*c)/4 + (1461*ya)/4 + (153*m+2)/5;
}

/**
  * Converts a Julian day to a Gregorian date. \n
  * This algorithm is taken from Communications of the ACM, Vol 6, No 8. \n
  * jd : the Julian day \n
  *  y : return year \n
  *  m : return month of year \n
  *  d : return day of month
 */
void jul2greg( uint jd, int &y, int &m, int &d )
{
	unsigned int x;
	unsigned int j = jd - 1721119;
	y = (j*4 - 1)/146097;
	j = j*4 - 146097*y - 1;
	x = j/4;
	j = (x*4 + 3) / 1461;
	y = 100*y + j;
	x = (x*4) + 3 - 1461*j;
	x = (x + 4)/4;
	m = (5*x - 3)/153;
	x = 5*x - 3 - 153*m;
	d = (x + 5)/5;
	if ( m < 10 ) {
		m += 3;
	} else {
		m -= 9;
		y++;
	}
}

///将grep格式的日期转换为bcd格式的日期 
/**
  * y, m, d : 年,月,日 \n
  * bcddate : 返回BCD格式的日期
  */
void greg2bcd(int y, int m, int d, uchar *bcddate)
{
	if(y<=99){
		y += 1900;
	}
	
	bcddate[0] = (((y%10000)/1000)<<4) | ((y%1000)/100);
	bcddate[1] = (((y%100)/10)<<4) | (y%10);
	bcddate[2] = (((m%13)/10)<<4) | (m%10);
	bcddate[3] = (((d%32)/10)<<4) | (d%10);
}

///bcd格式日期转换为greg格式日期
/**
  * bcddate : 待转换的bcd格式的日期 \n
  * y, m, n : 返回年月日
  */
void bcd2greg(const uchar *bcddate, int &y, int &m, int &d)
{
	y = ((bcddate[0]&0xF0)>>4) * 1000 + (bcddate[0]&0XF) * 100 +
		((bcddate[1]&0xF0)>>4) * 10 + (bcddate[1]&0xF);
	m = ((bcddate[2]&0xF0)>>4) * 10 + (bcddate[2]&0xF);
	if(m>12){
		m = 12;
	}
	if(m==0){
		m = 1;
	}
	d = ((bcddate[3]&0xF0)>>4) * 10 + (bcddate[3]&0xF);
}

///时间(y,m,d,h,mi,s)格式转成BCD格式
void greg2bcd_time(int y, int m, int d, int h, int mi, int s, uchar *bcdtime)
{
	if(y<=99){
		y += 1900;
	}
	
	bcdtime[0] = (((y%10000)/1000)<<4) | ((y%1000)/100);
	bcdtime[1] = (((y%100)/10)<<4) | (y%10);
	bcdtime[2] = (((m%13)/10)<<4) | (m%10);
	bcdtime[3] = (((d%32)/10)<<4) | (d%10);
	bcdtime[4] = (((h%60)/10)<<4) | (h%10);
	bcdtime[5] = (((mi%60)/10)<<4) | (mi%10);
	bcdtime[6] = (((s%60)/10)<<4) | (s%10);
}

///BCD格式时间转成(y,m,d,h,mi,s)格式
void bcd2greg_time(const uchar *bcdtime, int &y, int &m, int &d, int &h, int &mi, int &s)
{
	y = ((bcdtime[0]&0xF0)>>4) * 1000 + (bcdtime[0]&0XF) * 100 +
		((bcdtime[1]&0xF0)>>4) * 10 + (bcdtime[1]&0xF);
	m = ((bcdtime[2]&0xF0)>>4) * 10 + (bcdtime[2]&0xF);
	if(m>12){
		m = 12;
	}
	if(m==0){
		m = 1;
	}
	d = ((bcdtime[3]&0xF0)>>4) * 10 + (bcdtime[3]&0xF);
	h = ((bcdtime[4]&0xF0)>>4) * 10 + (bcdtime[4]&0xF);
	mi = ((bcdtime[5]&0xF0)>>4) * 10 + (bcdtime[5]&0xF);
	s = ((bcdtime[6]&0xF0)>>4) * 10 + (bcdtime[6]&0xF);
}

///将jul格式日期转换为bcd格式日期
void jul2bcd(unsigned int jd, uchar *bcddate)
{
	int y, m, d;
	jul2greg(jd, y, m, d);
	greg2bcd(y, m, d, bcddate);
}

///将bcd格式日期转换为jd格式日期
unsigned int bcd2jul(const uchar *bcddate)
{
	int y, m, d;
	bcd2greg(bcddate, y, m, d);
	return greg2jul(y, m, d);
}

void bcd2rt(const uchar *dt, int &y, int &m, int &d)
{
	bcd2greg(dt, y, m, d);
	y -= 1900;//y is since 1900
	if(y<0){
		y=0;
	}
	m--;//m is 0~11
	//note the day range is : 1~31
}

///以BCD格式比较日期大小
/**
  * d1/d2 : BCD格式的日期 \n
  * 返回 : <0, d1早于d2; =0, d1=d2; >0, d1晚于d2
  */
int	CmpBcdDate(const uchar *d1, const uchar *d2)
{
	uint jd1, jd2;
	jd1 = bcd2jul(d1);
	jd2 = bcd2jul(d2);
	if(jd1==jd2){
		return 0;
	}
	return (jd1>jd2) ? 1 : -1;
}

//输入函数
///十六进制数输入(适用于PIN输入,APDU测试等)
/**
  * Promt : 提示信息. \n
  * HexCount : 待输入的十六进制数的个数,即相应字符串的一半 \n
  * HexBuf : 返回十六进制字符串:如{0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0} \n
  */
void GetHexInput(const char *Promt, unsigned int HexCount, unsigned char *HexBuf)
{
	char buf[500];
	int ret;

	//check input
	if(Promt==NULL || HexCount==0 || HexBuf==NULL){
		printf("函数参数输入格式错误:GetHexInput.\n");
		return;
	}
	
	while(1){
		printf("%s%s%s%d%s", "\n", Promt, "(", HexCount, " Bytes): 0x");
		scanf("%s", buf);
		ret = CheckHexInput(buf, HexCount, HexBuf);
		if(ret==SUCC){
			return;
		}
		printf("输入格式错误,请重新输入.\n");
	}
}

//BCD数据的输入
void GetBcdInput(const char *Promt, unsigned int BcdCount, unsigned char *BcdBuf)
{
	char buf[500];
	int ret;

	//check input
	if(Promt==NULL || BcdCount==0 || BcdBuf==NULL){
		printf("函数参数输入格式错误:GetBcdInput.\n");
		return;
	}
	
	while(1){
		printf("%s%s%s%d%s", "\n", Promt, "(", BcdCount, " Bytes): ");
		scanf("%s", buf);
		ret = CheckBcdInput(buf, BcdCount, BcdBuf);
		if(ret==SUCC){
			return;
		}
		printf("输入格式错误,请重新输入.\n");
	}
}

///字符串输入(适用于项目名称输入,付款单位输入等)
/**
  * Promt : 提示信息. \n
  * Length : 待输入的字符串的长度 \n
  * StrBuf : 返回输入的字符串 \n
  */
void GetStrInput(const char *Promt, unsigned int Length, char *StrBuf)
{
	char buf[500];

	//check input
	if(Promt==NULL || Length==0 || StrBuf==NULL){
		printf("函数参数输入格式错误:GetStrInput.\n");
		return;
	}
	
	while(1){
		printf("%s%s%s%d%s", "\n", Promt, "(<=", Length, "):");
		scanf("%s", buf);
		if(strlen(buf)==0 || strlen(buf)>Length){
			printf("输入长度错误,请重新输入.\n");
			continue;
		}
		memset(StrBuf, 0, Length + 1);
		memcpy(StrBuf, buf, strlen(buf));
		return;
	}
}

///日期输入
/**
  * Promt : 提示信息,如,请输入申报数据截止日期 \n
  * DateBuf : 返回BCD格式的输入日期,如 {0x20, 0x06, 0x05, 0x22} \n
  * y, m, d : 返回相应的年月日
  */
void GetDateInput(const char *Promt, unsigned char *DateBuf,
		int *y, int *m, int *d)
{
	char buf[500];

	//check input
	if(Promt==NULL || DateBuf==NULL){
		printf("函数参数输入格式错误:GetDateInput.\n");
		return;
	}
	
	while(1){
		printf("%s%s%s", "\n", Promt, "(如:20060521):");
		scanf("%s", buf);
		if(strlen(buf)!=8){
			printf("输入长度错误,请重新输入.\n");
			continue;
		}
		if(CheckStrDateFormat((unsigned char*)buf)!=SUCC){
			printf("输入日期格式错误,请重新输入.\n");
			continue;
		}
		Str2Bcd(buf, DateBuf, 8);
		if(y!=NULL && m!=NULL && d!=NULL){
			bcd2greg(DateBuf, *y, *m, *d);
		}
		return;
	}
}

///时间输入
/**
  * Prompt : 提示信息 \n
  * TimeBuf : 返回BCD格式的时间,如0x23, 0x59, 0x30 \n
  * h, mi, s : 返回时间, 时分秒,如23,59,30
  */
void GetTimeInput(const char *Promt, unsigned char *TimeBuf,
		int *h, int *mi, int *s)
{
	char buf[500];
	int hh, mm, ss;

	//check input
	if(Promt==NULL || TimeBuf==NULL){
		printf("函数参数输入格式错误:GetTimeInput.\n");
		return;
	}
	
	while(1){
		printf("%s%s%s", "\n", Promt, "(如:23:59:55):");
		scanf("%s", buf);
		if(strlen(buf)!=8){
			printf("输入长度错误,请重新输入.\n");
			continue;
		}
		if(!(isdigit(buf[0]) &&
		     isdigit(buf[1]) &&
		     buf[2]==':' &&
		     isdigit(buf[3]) &&
		     isdigit(buf[4]) &&
		     buf[5]==':' &&
		     isdigit(buf[6]) &&
		     isdigit(buf[7])) ){
			printf("输入时间格式错误,请重新输入.\n");
			continue;
		}
		hh = (buf[0]-'0') * 10 + (buf[1]-'0');
		mm = (buf[3]-'0') * 10 + (buf[4]-'0');
		ss = (buf[6]-'0') * 10 + (buf[7]-'0');
		if(hh>=24 || mm>=60 || ss>=60){
			printf("输入时间格式错误,请重新输入.\n");
			continue;
		}
		
		buf[2] = buf[3];
		buf[3] = buf[4];
		buf[4] = buf[6];
		buf[5] = buf[7];
		Str2Bcd(buf, TimeBuf, 6);
		if(h!=NULL && mi!=NULL && s!=NULL){
			*h = hh;
			*mi = mm;
			*s = ss;
		}
		return;
	}
}

///整数输入(适用于发票号,各种数量输入)
/**
  * Promt : 提示信息 \n
  * Num : 返回输入的数量 \n
  */
void GetIntInput(const char *Promt, unsigned int &Num)
{
	int ret;
	char buf[500];

	//check input
	if(Promt==NULL){
		printf("函数参数输入格式错误:GetIntInput.\n");
		return;
	}
	
	while(1){
		printf("%s%s%s%u%s", "\n", Promt, "(<=", 0xFFFFFFFF, "):");
		scanf("%s", buf);
		ret = CheckIntInput(buf, Num);
		if(ret==SUCC){
			return;
		}
		printf("输入格式错误,请重新输入.\n");
	}
}

///金额输入(适用于商品单价输入)
/**
  * Promt : 提示信息 \n
  * Amount : 返回以分为单位的金额 \n
  */
void GetAmountInput(const char *Promt, unsigned int &Amount)
{
	int ret;
	char buf[500];

	//check input
	if(Promt==NULL){
		printf("函数参数输入格式错误:GetAmountInput.\n");
		return;
	}
	
	while(1){
		printf("%s%s%s%.2f%s", "\n", Promt, "(<=", 0xFFFFFFFF/100.0, "):");
		scanf("%s", buf);
		ret = CheckAmountInput(buf, Amount);
		if(ret==SUCC){
			return;
		}
		printf("输入格式错误,请重新输入.\n");
	}
}

///总参数量输入(适用于商品数量输入)
/**
  * Promt : 提示信息 \n
  * Num : 返回输入的去掉小数点后的数量 \n
  * LenOfFloatPart : 返回输入小数部分的长度 \n
  */
void GetFltNumInput(const char *Promt, unsigned int &Num, unsigned char &LenOfFloatPart)
{
	int ret;
	char buf[500];

	//check input
	if(Promt==NULL){
		printf("函数参数输入格式错误:GetFltNumInput.\n");
		return;
	}
	
	while(1){
		printf("%s%s%s%u%s", "\n", Promt, "(<=", 0xFFFFFF, ",如:1.2345678):");
		scanf("%s", buf);
		ret = CheckFltNumInput(buf, Num, LenOfFloatPart);
		if(ret==SUCC){
			return;
		}
		printf("输入格式错误,请重新输入.\n");
	}
}

//IP地址输入
void GetIPInput(const char *Promt, char *IPBuf)
{
	int ret;
	char buf[500];

	//check input
	if(Promt==NULL){
		printf("函数参数输入格式错误:GetIPInput.\n");
		return;
	}
	
	while(1){
		printf("%s%s%s", "\n", Promt, "(如:192.168.0.1):");
		scanf("%s", buf);
		ret = CheckIPInput(buf);
		if(ret==SUCC){
			memset(IPBuf, 0, 16);
			memcpy(IPBuf, buf, strlen(buf));
			return;
		}
		printf("输入格式错误,请重新输入.\n");
	}
}

///检查BCD格式的日期格式是否正确
/**
  * BcdDate : 待检查的日期,BCD格式 \n
  * 返回 : SUCC/其他
  */
int CheckBcdDateFormat(const unsigned char *BcdDate)
{
	//Check Input
	if(BcdDate==NULL){
		return INPUT_ERR;
	}

	int flag;
	int year, month, day;
	bcd2greg(BcdDate, year, month, day);


	if( year < 1900 ){
		return INPUT_ERR;
	}
	if( month > 12 || month <= 0 ){
		return INPUT_ERR;
	}
	if( day<=0 ){

⌨️ 快捷键说明

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