FXSend/LuTool.cpp
2025-02-28 17:05:50 +08:00

475 lines
9.4 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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