📄 pubcms.c
字号:
/******************************************************* ** 源码文件名称 : PubCms.c ** 功能描述 : 卡的公共函数 ** 所属子系统 : 卡管理 ** 当前文件版本 : 4.0.0.0 ** 作 者 : Feng ** 版本创建日期 : 2004/09/23 ** 修改记录 : ** 修改人 修改日期 修改位置*******************************************************/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>#include "code.h"#include "attrdef.h"#include "pubcom.h"#include "cmscode.h"/******************************************************* ** 函数名称:cmsDelDelimiter ** 功能描述:删除字符串中的间隔符号, 间隔符号指定 ** 输入参数: ** pcStrBuf ---- 字符串 ** cDelim ---- 间隔符 ** 输出参数: ** pcStrBuf ---- 字符串 ** 输出结果:void*******************************************************/int cmsDelDelimiter( pcStrBuf, cDelim )char *pcStrBuf;char cDelim;{ char *pcPos1; /* 字符串指针 临时 */ char *pcPos2; /* 字符串指针 过渡 */ char *pcPos3; /* 字符串指针 过渡 */ /* 将临时指针指向输入字符串 */ pcPos1 = pcStrBuf; pcPos3 = pcStrBuf; /* 判断字符串是否结束 进行循环 */ while ( *pcPos1 != '\0' ) { /* 判断字符是否为指定的间隔符号 */ if( *pcPos1 == cDelim ) { /* 将过渡指针指向间隔符号后的位置 */ pcPos2 = pcPos1; while( *pcPos2 != '\0' ) *pcPos2++ = *(pcPos2+1); pcPos1 = pcPos3; } else pcPos1++; } return SUCCESS;}/******************************************************* ** 函数名称:cmsStr2Dbl ** 功能描述:将类型为char的字符串转换为类型为double的数值 ** 字符串可以无结束符 ** 输入参数: ** pcStrBuf ---- 数字字符串 ** iBufLen ---- 字符串长度 ** iDotLen ---- 小数位数 ** 输出参数: ** pdDblBuf ---- 双精度数值 ** 输出结果:int ** 0 ---- 成功 ** -1 ---- 失败*******************************************************/int cmsStr2Dbl( pcStrBuf, iBufLen, iDotLen, pdDblBuf )char * pcStrBuf;int iBufLen;int iDotLen;double * pdDblBuf;{ char acStrBuf[ PACKBUF_LEN ]; /* 临时字符串变量 */ int iNum; /* 计数器 */ /* 初始化临时变量 */ memset ( acStrBuf, 0x00, sizeof( acStrBuf ) ); iNum = 0; /* 检查输入数据是否合法 */ if ( ( strlen ( pcStrBuf ) < iBufLen ) \ || ( strlen ( pcStrBuf ) < iDotLen ) \ || ( iDotLen > iBufLen ) ) { strcpy ( g_acRspCode, "CMS108" ); pubCrtRspInfo( pcStrBuf, iBufLen, iDotLen ); /* sprintf( g_acRspMsg, "数据非法[%s]长度[%d]小数[%d]", \ pcStrBuf, iBufLen, iDotLen ); */ ERRLOG return FAILED; } /* 在字符串中增加小数点 */ for( iNum = 0; iNum < iBufLen + 1; iNum++ ) { if( iNum == ( iBufLen - iDotLen ) ) acStrBuf[ iNum ] = '.' ; else acStrBuf[ iNum ] = *pcStrBuf++ ; } acStrBuf[ iNum ] = 0x00 ; /* 转换字符串为数值 */ *pdDblBuf = atof ( acStrBuf ); return SUCCESS;}/******************************************************* ** 函数名称:cmsStr2Flt ** 功能描述:将类型为char的字符串转换为类型为float的数值 ** 字符串可以无结束符 ** 输入参数: ** pcStrBuf ---- 数字字符串 ** iBufLen ---- 字符串长度 ** iDotLen ---- 小数位数 ** 输出参数: ** pfFltBuf ---- 浮点数数值 ** 输出结果:int ** 0 ---- 成功 ** -1 ---- 失败*******************************************************/int cmsStr2Flt( pcStrBuf, iBufLen, iDotLen, pfFltBuf )char * pcStrBuf;int iBufLen;int iDotLen;double * pfFltBuf;{ char acStrBuf[ PACKBUF_LEN ]; /* 临时字符串变量 */ int iNum; /* 计数器 */ /* 初始化临时变量 */ memset ( acStrBuf, 0x00, sizeof( acStrBuf ) ); iNum = 0; /* 检查输入数据是否合法 */ if ( ( strlen ( pcStrBuf ) < iBufLen ) \ || ( strlen ( pcStrBuf ) < iDotLen ) \ || ( iDotLen > iBufLen ) ) { strcpy ( g_acRspCode, "CMS108" ); pubCrtRspInfo( pcStrBuf, iBufLen, iDotLen ); /* sprintf( g_acRspMsg, "数据非法[%s]长度[%d]小数[%d]", \ pcStrBuf, iBufLen, iDotLen ); */ ERRLOG return FAILED; } /* 在字符串中增加小数点 */ for( iNum = 0; iNum < iBufLen + 1; iNum++ ) { if( iNum == ( iBufLen - iDotLen ) ) acStrBuf[ iNum ] = '.' ; else acStrBuf[ iNum ] = *pcStrBuf++ ; } acStrBuf[ iNum ] = 0x00 ; /* 转换字符串为数值 */ *pfFltBuf = atof ( acStrBuf ); return SUCCESS;}/******************************************************* ** 函数名称:cmsDbl2Str ** 功能描述:将类型为double的数值转换为类型为char的字符串 ** 字符串可以无结束符 ** 输入参数: ** dDblBuf ---- 双精度数值 ** iDotLen ---- 小数位数 ** iBufLen ---- 字符串长度 ** iSign ---- 小数位数 ** 0:无符号 ** 1:加符号 ** 输出参数: ** pcStrBuf ---- 数字字符串 ** 输出结果:int ** 0 ---- 成功 ** -1 ---- 失败*******************************************************/int cmsDbl2Str( dDblBuf, iDotLen, iBufLen, iSign, pcStrBuf )double dDblBuf;int iDotLen;int iBufLen;int iSign;char * pcStrBuf;{ char acStrBuf[ PACKBUF_LEN ]; /* 临时字符串变量 */ char acStrTmp[ PACKBUF_LEN ]; /* 临时字符串变量2 */ char acStrStore[ PACKBUF_LEN ]; /* 临时字符串变量3 */ char acFmt[ FMTJST_LEN + 1 ]; /* 格式串 */ char *pcStr; /* 临时字符串指针 */ double dDblTmp; /* 临时双精度变量 */ /* 初始化临时变量 */ memset ( acStrBuf, 0x00, sizeof( acStrBuf ) ); memset ( acStrTmp, 0x00, sizeof( acStrTmp ) ); memset ( acStrStore, 0x00, sizeof( acStrStore ) ); /* 检查输入数据是否合法 */ if ( iDotLen > iBufLen ) { strcpy ( g_acRspCode, "CMS109" ); pubCrtRspInfo( pcStrBuf, iBufLen, iDotLen ); /* sprintf( g_acRspMsg, "数据非法长度[%d]小数[%d]", iBufLen, iDotLen ); */ ERRLOG return FAILED; } /* 对双精度数值进行截位,保留约定小数位 */ dDblTmp = dDblBuf; cmsDblTrunc( &dDblTmp, iDotLen ); /* 组织格式串 */ sprintf( acFmt, "%%#0%d.%df", iBufLen + 2, iDotLen ); sprintf( acStrBuf, acFmt, dDblTmp ); strcpy ( acStrTmp, &acStrBuf[1] ); /* 有标志位转换 */ if ( iSign != 0 ) { strcpy ( acStrStore, acStrTmp ); pcStr = strtok( acStrStore, "." ); if ( strlen( pcStr ) > ( iBufLen - iDotLen - 1 ) ) memcpy ( &acStrBuf[1], \ &acStrTmp[ strlen( pcStr ) - iBufLen + iDotLen + 1 ],\ iBufLen - iDotLen ); else strcpy ( &acStrBuf[1], pcStr ); pcStr = strtok( NULL, "." ); memcpy ( &acStrBuf[ iBufLen - iDotLen ], pcStr, iDotLen ); if ( dDblBuf < 0.00 ) acStrBuf[ 0 ] = '-'; } /* 无符号位转换 */ else { strcpy ( acStrStore, acStrTmp ); pcStr = strtok( acStrStore, "." ); if ( strlen( pcStr ) > ( iBufLen - iDotLen ) ) memcpy ( acStrBuf, \ &acStrTmp[ strlen( pcStr ) - iBufLen + iDotLen ], \ iBufLen - iDotLen ); else strcpy ( acStrBuf, pcStr ); pcStr = strtok( NULL, "." ); memcpy ( &acStrBuf[ iBufLen - iDotLen ], pcStr, iDotLen ); } /* 赋值到输出参数 */ memcpy ( pcStrBuf, acStrBuf, iBufLen ); return SUCCESS;}/******************************************************* ** 函数名称:cmsDblTrunc ** 功能描述:对双精度数值进行截位,保留约定小数位 ** 输入参数: ** pdDblBuf ---- 双精度数值 ** iDotLen ---- 小数位数 ** 负数表示从小数点向前截 ** 输出参数: ** pdDblBuf ---- 双精度数值 ** 输出结果:int ** 0 ---- 成功 ** -1 ---- 失败*******************************************************/int cmsDblTrunc( pdDblBuf, iDotLen )double * pdDblBuf;int iDotLen;{ char acStrBuf[ PACKBUF_LEN ]; /* 临时字符串变量 */ char acFmt[ FMTJST_LEN + 1 ]; /* 格式串 */ double dDblTmp; /* 临时双精度变量 */ int iNum; /* 计数器 整数位数 */ int iBufLen; /* 长度 */ /* 初始化临时变量 */ memset ( acStrBuf, 0x00, sizeof( acStrBuf ) ); /* 组织格式串 */ sprintf( acFmt, "%%.%df", iDotLen + 1 ); sprintf( acStrBuf, acFmt, *pdDblBuf ); /* 小数偏移调整 */ iBufLen = strlen ( acStrBuf ); for( iNum = 0; ( iNum < iBufLen ) && ( acStrBuf[ iNum ] != '.');\ iNum ++ ); /* 将字符串尾部进行处理 */ if ( iDotLen >= 0 ) memset ( &acStrBuf[ iNum + iDotLen + 1 ], 0x00, \ PACKBUF_LEN - ( iNum + iDotLen + 2 ) ); else { memset ( &acStrBuf[ iNum + iDotLen ], '0', iDotLen * ( -1 ) ); memset ( &acStrBuf[ iNum ], 0x00, PACKBUF_LEN - iNum + 1 ); } /* 赋值到输出参数 */ dDblTmp = atof ( acStrBuf ); *pdDblBuf = dDblTmp; return SUCCESS;}/******************************************************* ** 函数名称:cmsAtoI ** 功能描述:将类型为char的字符串转换为类型为int的数值 ** 字符串可以无结束符 ** 输入参数: ** pcStrBuf ---- 字符串 ** iBufLen ---- 字符串长度 ** 输出参数: ** piIntBuf ---- 整数数值 ** 输出结果:int ** >=0 ---- 成功=输出参数 ** -1 ---- 失败*******************************************************/int cmsAtoI( pcStrBuf, iBufLen, piIntBuf )char * pcStrBuf;int iBufLen;int * piIntBuf;{ char acStrBuf[ PACKBUF_LEN ]; /* 临时字符串变量 */ /* 初始化临时变量 */ memset ( acStrBuf, 0x00, sizeof( acStrBuf ) ); /* 转换字符串 */ if ( iBufLen > 1 ) memcpy ( acStrBuf, pcStrBuf, iBufLen ); else { acStrBuf[ 0 ] = *pcStrBuf; memcpy ( acStrBuf + 1, 0x00, sizeof( acStrBuf ) - 1 ); } /* 赋值到输出参数 */ *piIntBuf = atoi( acStrBuf ); return( *piIntBuf );}/******************************************************* ** 函数名称:cmsAtoL ** 功能描述:将类型为char的字符串转换为类型为long的数值 ** 字符串可以无结束符 ** 输入参数: ** pcStrBuf ---- 字符串 ** iBufLen ---- 字符串长度 ** 输出参数: ** piIntBuf ---- 整数数值 ** 输出结果:int ** >=0 ---- 成功=输出参数 ** -1 ---- 失败*******************************************************/int cmsAtoL( pcStrBuf, iBufLen, piIntBuf )char * pcStrBuf;int iBufLen;int * piIntBuf;{ char acStrBuf[ PACKBUF_LEN ]; /* 临时字符串变量 */ /* 初始化临时变量 */ memset ( acStrBuf, 0x00, sizeof( acStrBuf ) ); /* 转换字符串 */ if ( iBufLen > 1 ) memcpy ( acStrBuf, pcStrBuf, iBufLen ); else { acStrBuf[ 0 ] = *pcStrBuf; memcpy ( acStrBuf + 1, 0x00, sizeof( acStrBuf ) - 1 ); } /* 赋值到输出参数 */ *piIntBuf = atol( acStrBuf ); return( *piIntBuf );}/******************************************************* ** 函数名称:cmsGenPreAuthCode ** 功能描述:生成预授权码 ** 输入参数: ** 输出参数: ** pcAuthCode ---- 授权码 ** 输出结果:int ** =0 ---- 成功 ** -1 ---- 失败*******************************************************/int cmsgenPreAuthCode( pcAuthCode )char * pcAuthCode;{ time_t iTime = 0; time_t iRetTime = 0; char acBuf[ FMTJST_LEN + 1 ]; memset ( acBuf, 0x00, sizeof( acBuf ) ); iRetTime = time ( &iTime ); seed48 ( ( unsigned short * ) &iRetTime ); sprintf ( acBuf , "%d" , lrand48() ); strncpy ( pcAuthCode , acBuf, 6 ); return SUCCESS;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -