475 lines
9.4 KiB
C++
475 lines
9.4 KiB
C++
#include "stdafx.h"
|
||
#ifndef LUTOOL_CPP
|
||
#define LUTOOL_CPP
|
||
//截左右空格
|
||
//入口:ss 要截的字符串
|
||
//出口:ss 完成后的字符串
|
||
char * AllTrim( char * ss )
|
||
{
|
||
int i,j;
|
||
int len;
|
||
len=lstrlen(ss);
|
||
for (i=1;i<len;i++)
|
||
{
|
||
if (ss[len-i]==' ')
|
||
ss[len-i]=0;
|
||
else
|
||
break;
|
||
}
|
||
len=lstrlen(ss);
|
||
for (i=0;i<len;i++)
|
||
if (ss[i]!=' ') break;
|
||
for (j=0;j<len-i;j++)
|
||
{
|
||
ss[j]=ss[j+i];
|
||
}
|
||
ss[j]=0;
|
||
return ss;
|
||
}
|
||
|
||
//去除指定的字符
|
||
char * ExChar( char * szSrc , char * pEx )
|
||
{
|
||
char Buf[4096];
|
||
char pComp[4096];
|
||
lstrcpy( Buf , szSrc );
|
||
long lLen = lstrlen( Buf );
|
||
long lLen2= lstrlen( pEx );
|
||
int j =0;
|
||
for ( int i =0 ; i< lLen ; i++ )
|
||
{
|
||
memcpy( pComp , Buf+i , lLen2 );
|
||
pComp[lLen2] = 0;
|
||
if (!lstrcmp( pComp , pEx ) )
|
||
{
|
||
i = i+lLen2-1; //因为for会加1,所以必需先-1
|
||
}
|
||
else
|
||
{
|
||
szSrc[j] = Buf[i];
|
||
j++;
|
||
}
|
||
}
|
||
szSrc[j]=0;
|
||
return szSrc;
|
||
}
|
||
|
||
//查找指定的字符串
|
||
int FoundChar( char * szSrc , char * pEx , long lLen)
|
||
{
|
||
char pComp[4096];
|
||
if ( lLen == 0 ) //如果没指定长度,则取原字符串长度
|
||
lLen = lstrlen( szSrc );
|
||
long lLen2= lstrlen( pEx );
|
||
int j =0;
|
||
for ( int i =0 ; i< lLen ; i++ )
|
||
{
|
||
memcpy( pComp , szSrc+i , lLen2 );
|
||
pComp[lLen2] = 0;
|
||
if (!lstrcmp( pComp , pEx ) )
|
||
{
|
||
return i+1;
|
||
}
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
//从收的客户的请求中读取数据
|
||
//入口参数:szMess 需要分析的源字符串
|
||
// szRec 分析后的返回字符串
|
||
// iNo 分析第N个子参数
|
||
// cMake 根据什么字符分析字串
|
||
//出口参数:char * 分析后的字符串,错误将返回NULL
|
||
|
||
bool GetReqMess(char *szMess,char *szRec,int iNo,char cMake , long lMessLen) //从收的客户的请求中读取数据
|
||
{
|
||
int iTemp;
|
||
int iTemp1;
|
||
int iTempNo;
|
||
iTemp1=0;
|
||
iTempNo=0;
|
||
szRec[0]=0;
|
||
if ( lMessLen <=0 ) lMessLen = lstrlen(szMess);
|
||
for (iTemp=0;iTemp<lMessLen;iTemp++)
|
||
{
|
||
szRec[iTemp1]=szMess[iTemp];
|
||
if (szMess[iTemp]==cMake)
|
||
{
|
||
if (iTempNo==iNo)
|
||
{
|
||
szRec[iTemp1]=0;
|
||
return true;
|
||
}
|
||
iTempNo=iTempNo+1;
|
||
iTemp1=-1; //因为后面还要加1最后为0
|
||
}
|
||
iTemp1=iTemp1+1;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
BOOL EnCodePasswd( char * szSourse , char * szTarget )
|
||
{
|
||
long lSourseLen = lstrlen( szSourse );
|
||
long lCode;
|
||
long i;
|
||
long lRound;
|
||
char szBuf[ 64 ];
|
||
*szTarget = 0;
|
||
lCode = ( lSourseLen + 13 )*7;
|
||
wsprintf( szTarget , "%04X" , lCode );
|
||
wsprintf( szTarget , "" );
|
||
//第一个字符为随机符
|
||
lRound = GetRoundValue('A' , 'Z' );
|
||
sprintf( szBuf , "%c" , lRound );
|
||
lstrcat( szTarget , szBuf );
|
||
for ( i = 0 ; i<lSourseLen ; i++ )
|
||
{
|
||
if ( i%2 == 0 )
|
||
{
|
||
lCode = ( szSourse[ i ] + 9 - i ) * 4 ;
|
||
}
|
||
else
|
||
{
|
||
lCode = ( szSourse[ i ] + 17 - i ) * 3 ;
|
||
}
|
||
sprintf( szBuf , "%03X" , lCode );
|
||
lstrcat( szTarget , szBuf );
|
||
lRound = GetRoundValue('A' , 'Z' );
|
||
sprintf( szBuf , "%c" , lRound );
|
||
lstrcat( szTarget , szBuf );
|
||
}
|
||
lCode = 0;
|
||
return true;
|
||
}
|
||
|
||
BOOL DeCodePasswd( char * szSourse , char * szTarget )
|
||
{
|
||
long lSourseLen = lstrlen( szSourse );
|
||
if ( lSourseLen < 1 )
|
||
{
|
||
return false;
|
||
}
|
||
long lCode;
|
||
long i;
|
||
char szBuf[ 64 ];
|
||
char *endptr;
|
||
lSourseLen = lSourseLen/4 ;
|
||
szSourse ++ ; //因为第一个为随机字符,无需
|
||
for ( i = 0 ; i<lSourseLen ; i++ )
|
||
{
|
||
strncpy( szBuf , szSourse , 3 );
|
||
szBuf[ 3 ]=0;
|
||
szSourse = &szSourse[4]; //因为多了一随机字符,无需
|
||
lCode = strtol( szBuf , &endptr , 16 );
|
||
if ( i%2 == 0 )
|
||
{
|
||
szTarget[ i ] = (char)(( lCode / 4 ) -9 + i);
|
||
}
|
||
else
|
||
{
|
||
szTarget[ i ] = (char)(( lCode / 3 ) -17 + i);
|
||
}
|
||
}
|
||
szTarget[ i ] = 0;
|
||
lCode = 0;
|
||
return true;
|
||
}
|
||
|
||
int CharHex(char ch)
|
||
{
|
||
//if( isdigit( ch ) ) return( atoi( &ch) );
|
||
if( ch >='0' && ch <= '9' ) return( atoi( &ch) );
|
||
else {
|
||
if( ch == 'a' || ch == 'A' ) return( 10 );
|
||
if( ch == 'b' || ch == 'B' ) return( 11 );
|
||
if( ch == 'c' || ch == 'C' ) return( 12 );
|
||
if( ch == 'd' || ch == 'D' ) return( 13 );
|
||
if( ch == 'e' || ch == 'E' ) return( 14 );
|
||
if( ch == 'f' || ch == 'F' ) return( 15 );
|
||
}
|
||
return( 0 );
|
||
}
|
||
DWORD StrToHex(const char *pstr, CHAR *hex)
|
||
{
|
||
int n = strlen( pstr );
|
||
int i = 0,j = 0;
|
||
for( ;i < n;i ++,j++ ) {
|
||
CHAR ntmp;
|
||
hex[j] = 0;
|
||
ntmp = CharHex( pstr[i] );
|
||
ntmp <<= 4;
|
||
hex[j] += ntmp;
|
||
i ++;
|
||
ntmp = CharHex( pstr[i] );
|
||
hex[j] += ntmp;
|
||
}
|
||
return n/2;
|
||
}
|
||
void AsciiToHex( char *pszOrgRandom , char *pszDesRandom , long lLen)
|
||
{
|
||
char *p = (char *)pszDesRandom;
|
||
//long lLen = lstrlen( (char*)pszOrgRandom);
|
||
for( long i = 0; i < lLen; ++i )
|
||
{
|
||
sprintf(p, "%02X", (BYTE)pszOrgRandom[i] );
|
||
p += 2;
|
||
}
|
||
*p=0;
|
||
}
|
||
|
||
/*
|
||
void HexToAscii( char *pszOrgRandom , char *pszDesRandom )
|
||
{
|
||
char Buf[4];
|
||
char *pDes = (char *)pszDesRandom;
|
||
char *pOrg = (char *)pszOrgRandom;
|
||
long lLen = lstrlen( pOrg);
|
||
long lTemp;
|
||
for( int i = 0; i < lLen/2; ++i )
|
||
{
|
||
memcpy( Buf , pOrg+i*2 , 2 );
|
||
Buf[2] = 0;
|
||
lTemp = CharHex(Buf[0])*16 + CharHex(Buf[1]);
|
||
if ( i%2 == 1 )
|
||
pDes[i-1] = (char)lTemp; //倒转
|
||
else
|
||
pDes[i+1] = (char)lTemp; //倒转
|
||
|
||
}
|
||
pDes[i] = 0;
|
||
}
|
||
*/
|
||
|
||
void HexToAscii( char *pszOrgRandom , char *pszDesRandom )
|
||
{
|
||
char Buf[4];
|
||
char *pDes = (char *)pszDesRandom;
|
||
char *pOrg = (char *)pszOrgRandom;
|
||
long lLen = lstrlen( pOrg);
|
||
long lTemp;
|
||
for( int i = 0; i < lLen/2; ++i )
|
||
{
|
||
memcpy( Buf , pOrg+i*2 , 2 );
|
||
Buf[2] = 0;
|
||
lTemp = CharHex(Buf[0])*16 + CharHex(Buf[1]);
|
||
pDes[i] = (char)lTemp;
|
||
}
|
||
pDes[i] = 0;
|
||
}
|
||
|
||
void ExchangeUniCode( char * pData )
|
||
{
|
||
char pEx[4];
|
||
long lLen = lstrlen( pData );
|
||
for ( int i = 0 ; i< lLen/4 ; i++ )
|
||
{
|
||
memcpy( pEx , pData+i*4 , 2 );
|
||
memcpy( pData+i*4 , pData+i*4+2 , 2 );
|
||
memcpy( pData+i*4+2 , pEx , 2 );
|
||
}
|
||
}
|
||
|
||
void ExchangeChar( char * pData )
|
||
{
|
||
char pEx;
|
||
long lLen = lstrlen( pData );
|
||
for ( int i = 0 ; i< lLen ; i++ )
|
||
{
|
||
pEx = pData[i+1];
|
||
pData[i+1] = pData[i];
|
||
pData[i] = pEx;
|
||
i = i+1 ;
|
||
}
|
||
}
|
||
|
||
void HexToPhoneName( char * pHex , char * pName )
|
||
{
|
||
char szName2[4096];
|
||
ExChar( pHex , "\"");
|
||
long lLen = lstrlen( pHex );
|
||
ExchangeUniCode( pHex );
|
||
HexToAscii( pHex , szName2 );
|
||
long l = WideCharToMultiByte( CP_ACP,NULL,(LPWSTR)szName2 , lLen/4 , pName , 256 , NULL , NULL);
|
||
pName[l] = 0;
|
||
}
|
||
|
||
void PhoneNameToHex( char * pName , char * pHex)
|
||
{
|
||
char szName2[4096];
|
||
char szHex2[4096];
|
||
long lLen = lstrlen( pName );
|
||
long l = MultiByteToWideChar( CP_ACP,NULL,pName,lLen, (LPWSTR)szName2 , 4096 );
|
||
szName2[l*2]=0;
|
||
AsciiToHex( szName2 , szHex2 , l*2);
|
||
ExchangeUniCode( szHex2 );
|
||
wsprintf( pHex , "%s" , szHex2 );
|
||
}
|
||
|
||
long TwoCharToHex( char * Buf )
|
||
{
|
||
return CharHex(Buf[0])*16 + CharHex(Buf[1]);
|
||
}
|
||
|
||
|
||
BOOL GetDeRNFromEnRN(char *pEnRN, char *pDeRN)
|
||
{
|
||
char RN[64];
|
||
if ( DeCodePasswd( pEnRN , RN ) )
|
||
{
|
||
long lLen = lstrlen( RN );
|
||
for ( int i =0 ; i<lLen ; i++ )
|
||
{
|
||
pDeRN[i]=~(-RN[i]);
|
||
}
|
||
pDeRN[i]=0;
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
BOOL GetEnRNFromDeRN(char *pDeRN, char *pEnRN)
|
||
{
|
||
char RN[64];
|
||
long lLen = lstrlen( pDeRN );
|
||
for ( int i = 0; i< lLen ; i++ )
|
||
{
|
||
RN[i] = -(~pDeRN[i]);
|
||
}
|
||
RN[i] = 0;
|
||
return EnCodePasswd( RN , pEnRN );
|
||
}
|
||
|
||
//返回固定区间的随机数
|
||
long GetRoundValue(long lMin , long lMax )
|
||
{
|
||
long l ;
|
||
long lRec;
|
||
SYSTEMTIME time;
|
||
while (true)
|
||
{
|
||
::GetSystemTime(&time);
|
||
l = time.wMinute*600+time.wHour*6000+time.wSecond*200+time.wMilliseconds;
|
||
l = rand();
|
||
lRec = l%lMax;
|
||
if (lRec >= lMin )
|
||
return lRec;
|
||
}
|
||
return l;
|
||
}
|
||
|
||
//查找指定的标志
|
||
int FoundCharEx( char * szSrc , long lSrcLen , char * pEx , long lExLen)
|
||
{
|
||
char pComp[128];
|
||
long lLen = lSrcLen;
|
||
if ( lSrcLen <= 0 ) //如果没指定长度,则取原字符串长度
|
||
lLen = lstrlen( szSrc );
|
||
long lLen2= lExLen;
|
||
if ( lLen2 <= 0 ) //如果没指定长度,则取原字符串长度
|
||
lLen2 = lstrlen( pEx );
|
||
|
||
int j =0;
|
||
for ( int i =0 ; i< lLen ; i++ )
|
||
{
|
||
memcpy( pComp , szSrc+i , lLen2 );
|
||
pComp[lLen2] = 0;
|
||
if (!strncmp( pComp , pEx , lLen2) )
|
||
{
|
||
return i+1;
|
||
}
|
||
}
|
||
return 0;
|
||
}
|
||
//比较两个电话号码是否相同
|
||
BOOL StrCmpMobile( char * pNo1 , char * pNo2 )
|
||
{
|
||
char szNo1[64];
|
||
char szNo2[64];
|
||
DZStr( pNo1 , szNo1 ); //倒转字符
|
||
DZStr( pNo2 , szNo2 );
|
||
ExChar( szNo1 , "+" ); //去除+号,国际标志
|
||
ExChar( szNo2 , "+" );
|
||
long lLen1 = lstrlen(szNo1 );
|
||
long lLen2 = lstrlen(szNo2 );
|
||
long lMin = lLen1>lLen2?lLen2:lLen1;
|
||
return !strncmp( szNo1 , szNo2 , lMin );
|
||
}
|
||
//倒转字符
|
||
void DZStr( char * pYChar , char * pDZChar )
|
||
{
|
||
long lLen = lstrlen( pYChar );
|
||
for ( int i = 0 ; i< lLen ; i ++ )
|
||
{
|
||
pDZChar[i] = pYChar[lLen-i-1];
|
||
}
|
||
pDZChar[i] = 0;
|
||
}
|
||
|
||
//解开7Bit编码的字串
|
||
long DeCode7Bit(char *pSrc, char * pTag , long lSrcLen)
|
||
{
|
||
if ( lSrcLen <= 0 )
|
||
lSrcLen = lstrlen( pSrc );
|
||
//long lSrcLen = lstrlen( pSrc );
|
||
unsigned char c,c1;
|
||
unsigned char mask1 = 0;
|
||
unsigned char mask2 = 0;
|
||
long TagCount = 0;
|
||
long lCount = 7;
|
||
for (int i=0 ; i< lSrcLen ; i++ )
|
||
{
|
||
c = (unsigned char)pSrc[i]; //取得当前需要转换字符
|
||
mask2 = c>>lCount; //取得下一字符的左边的mask
|
||
c1 = c<<(8-lCount); //右移取得8bit右边值
|
||
c1 = c1>>1; //因为最高位为0
|
||
c1 = c1|mask1; //合并后取得正常值
|
||
mask1 = mask2; //保存mask
|
||
pTag[TagCount] = c1;
|
||
TagCount ++ ;
|
||
lCount -- ;
|
||
if ( lCount <=0 )
|
||
{
|
||
lCount = 7;
|
||
pTag[TagCount] = mask1;
|
||
TagCount ++ ;
|
||
mask1 = 0;
|
||
mask2 = 0;
|
||
}
|
||
}
|
||
pTag[TagCount] = 0;
|
||
return TagCount;
|
||
}
|
||
|
||
char * ExMobileGZM( char * pMobile )
|
||
{
|
||
char szBuf[64];
|
||
strcpy( szBuf , pMobile );
|
||
if ( !strncmp( szBuf , "+86" , strlen("+86") ) )
|
||
{
|
||
strcpy( pMobile , szBuf+3 );
|
||
return pMobile;
|
||
}
|
||
if ( !strncmp( szBuf , "0086" , strlen("0086") ) )
|
||
{
|
||
strcpy( pMobile , szBuf+4 );
|
||
return pMobile;
|
||
}
|
||
if ( !strncmp( szBuf , "86" , strlen("86") ) )
|
||
{
|
||
strcpy( pMobile , szBuf+2 );
|
||
return pMobile;
|
||
}
|
||
if ( !strncmp( szBuf , "+" , strlen("+") ) )
|
||
{
|
||
strcpy( pMobile , szBuf+1 );
|
||
return pMobile;
|
||
}
|
||
if ( !strncmp( szBuf , "00" , strlen("00") ) )
|
||
{
|
||
strcpy( pMobile , szBuf+2 );
|
||
return pMobile;
|
||
}
|
||
return pMobile;
|
||
}
|
||
#endif |