📄 globalfunc.cpp
字号:
#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 + -