www.pudn.com > 200410111032011273DESMD5ZLIB算法源代码.rar > String.cpp


#include "stdafx.h" 
#include "ArithDLL.h" 
 
 
ARITHDLL_API int WINAPI KMPSearchMem(char *pcdad, int ndad, char *pcsub, int nsub) 
{ 
    if (nsub>ndad || nsub>512 || nsub<=0) 
		return -1; 
 
	int iNext[512]; 
	int i, j; 
 
    for(i=0; i<512; i++) iNext[i]=-1; 
 
    i=0; j=-1; 
    while (i < nsub) 
    { 
        while((j!=-1) && (pcsub[j]!=pcsub[i])) 
            j = iNext[j]; 
        i++; j++; 
        if (pcsub[i]!=pcsub[j]) 
            iNext[i] = j; 
        else iNext[i] = iNext[j]; 
	} 
 
	i=0; j=0; 
	while( j=nsub) return(i-j); 
    } 
	return -1; 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
// 
// 
// 
////////////////////////////////////////////////////////////////////// 
ARITHDLL_API BOOL WINAPI ChangeStringVisible(BYTE *pbyBuf, int iBufLen,  
						 BYTE *pbyDest, int &iMaxDestLen, 
						 BOOL bVisible) 
{ 
	int iOffset=0; 
	int i; 
	BYTE by1, by2; 
 
	if ( bVisible ) 
	{	//将不可见字符变成BCD码 
		for(i=0; i=' ' && pbyBuf[i]<=0x7E ) 
			{ 
				pbyDest[iOffset] = pbyBuf[i]; 
				continue; 
			} 
			if ( pbyBuf[i]>=0xA1 ) 
			{	//中文 
				if ((i+1)=0xA1) 
				{ 
					if (iOffset+2 < iMaxDestLen) 
					{ 
						pbyDest[iOffset] = pbyBuf[i]; 
						pbyDest[iOffset+1] = pbyBuf[i+1]; 
						++iOffset, ++i; 
					} 
					else break; 
					continue; 
				} 
			} 
			if ( iOffset+4 < iMaxDestLen ) 
			{ 
				pbyDest[iOffset] = '\\'; 
				pbyDest[iOffset+1] = 'X'; 
				pbyDest[iOffset+2] = ((pbyBuf[i]&0xF0)>>4)+0x30; 
				pbyDest[iOffset+3] = (pbyBuf[i]&0x0F)+0x30; 
				if ( pbyDest[iOffset+2] > '9' ) 
					pbyDest[iOffset+2] += 7; 
				if ( pbyDest[iOffset+3] > '9' ) 
					pbyDest[iOffset+3] += 7; 
				iOffset += 3; 
			} 
			else 
			{ 
				iMaxDestLen = iOffset; 
				return FALSE; 
			} 
		} 
	} 
	else 
	{	//将BCD码变成不可见字符 
		for(i=0; i= iBufLen ) 
				break; 
			if ( pbyBuf[i] == '\\' ) 
			{ 
				pbyDest[iOffset] = '\\'; 
				continue; 
			} 
			if ( (pbyBuf[i]&0xDF)!='X' || (i+2)>=iBufLen ) 
			{ 
				break; 
			} 
			++i; 
			if (((pbyBuf[i]>='0' && pbyBuf[i]<='9') ||  
				 ((pbyBuf[i]&0xDF)>='A' && (pbyBuf[i]&0xDF)<='F') ) && 
				((pbyBuf[i+1]>='0' && pbyBuf[i+1]<='9') ||  
				 ((pbyBuf[i+1]&0xDF)>='A' && (pbyBuf[i+1]&0xDF)<='F') )) 
			{ 
			    by1 = pbyBuf[i]-0x30;  
				by2 = pbyBuf[i+1]-0x30; 
				pbyDest[iOffset] = (((by1<=0x09) ? by1 : (by1&0x0F)+9)<<4) +  
								   ((by2<=0x09) ? by2 : ((by2&0x0F)+9) ); 
				++i; 
			} 
			else 
			{ 
				iMaxDestLen = iOffset; 
				return FALSE; 
			} 
		} 
 
	} 
	iMaxDestLen = iOffset; 
	return (i>=iBufLen); 
} 
 
ARITHDLL_API BOOL WINAPI ChangeStringSeparator(char *pcBuf, int iBufLen,  
						 char *pcDest, int &iMaxDestLen, 
						 char cSeparator, BOOL bType) 
{ 
	int iOffset=0; 
	int i; 
 
	if ( bType ) 
	{	//取消分隔符,将分隔符变成"{0", 而'{'变成"{{" 
		for(i=0; i= iMaxDestLen ) 
			{ 
				break; 
			} 
			pcDest[iOffset++] = '{'; 
			if ( pcBuf[i]=='{' ) 
			{ 
				pcDest[iOffset] = '{'; 
			} 
			else 
			{ 
				pcDest[iOffset] = '0'; 
			} 
		} 
	} 
	else 
	{	//还原分隔符 
		for(i=0; i= iBufLen) 
			{ 
				break; 
			} 
			else if (pcBuf[i] == '{' ) 
			{ 
				pcDest[iOffset] = '{'; 
			} 
			else if  (pcBuf[i] == '0' ) 
			{ 
				pcDest[iOffset] = cSeparator; 
			} 
			else  
			{ 
				break; 
			} 
		} 
	} 
	iMaxDestLen = iOffset; 
	return (i>=iBufLen); 
} 
 
//--------------------------------------------------------------------------- 
//从元旦开始的天数0,1,2,3 
int YearDays(int iYear, int iMonth, int iDay) 
{ 
	int iAdjust=0; 
	//润年 
	if (((iYear%400)==0) || ((iYear%4)==0 && (iYear%100)!=0)) 
		iAdjust = 1; 
	switch(iMonth) 
	{ 
   	case 1:	 
		iAdjust = 0;  
		break; 
    case 2:	 
		iAdjust = 31;  
		break; 
   	case 3:	 
		iAdjust += 59;  
		break; 
    case 4:	 
		iAdjust += 90;  
		break; 
   	case 5:	 
		iAdjust += 120;	 
		break; 
    case 6:	 
		iAdjust += 151;	 
		break; 
   	case 7:	 
		iAdjust += 181;	 
		break; 
    case 8:	 
		iAdjust += 212;	 
		break; 
   	case 9:	 
		iAdjust += 243;	 
		break; 
    case 10: 
		iAdjust += 273;	 
		break; 
   	case 11: 
		iAdjust += 304;	 
		break; 
    case 12: 
		iAdjust += 334; 
		break; 
   	default: 
		break; 
	} 
	return(iDay+iAdjust-1); 
} 
 
//--------------------------------------------------------------------------- 
//两时间相差天数 1-2 
ARITHDLL_API int WINAPI IntDateCmp(int iYear1, int iMonth1, int iDay1, 
							 int iYear2, int iMonth2, int iDay2) 
{ 
	int iRet = (iYear1-iYear2)*365; 
 
	//中间润年天数 
	iRet += ((iYear1-1)/4-(iYear1-1)/100+(iYear1-1)/400 - 
		    ((iYear2-1)/4-(iYear2-1)/100+(iYear2-1)/400)); 
	iRet += (YearDays(iYear1,iMonth1,iDay1) - YearDays(iYear2,iMonth2,iDay2)); 
	 
	return(iRet); 
} 
 
//--------------------------------------------------------------------------- 
//两时间相差天数 1-2 
//pc1Date1 yyyy/mm/dd 或 yyyy-mm-dd 或 
ARITHDLL_API int WINAPI StrDateCmp(char *pcDate1, char *pcDate2) 
{ 
	int iYear1, iMonth1, iDay1; 
	int iYear2, iMonth2, iDay2; 
 
    iYear1  = (pcDate1[0]&0x0F)*1000 +  
			  (pcDate1[1]&0x0F)*100 +  
			  (pcDate1[2]&0x0F)*10 +  
			  (pcDate1[3]&0x0F); 
	iMonth1 = (pcDate1[5]&0x0F)*10 +  
			  (pcDate1[6]&0x0F); 
	iDay1   = (pcDate1[8]&0x0F)*10 +  
			  (pcDate1[9]&0x0F); 
 
    iYear2  = (pcDate2[0]&0x0F)*1000 +  
			  (pcDate2[1]&0x0F)*100 +  
			  (pcDate2[2]&0x0F)*10 +  
			  (pcDate2[3]&0x0F); 
	iMonth2 = (pcDate2[5]&0x0F)*10 +  
			  (pcDate2[6]&0x0F); 
	iDay2   = (pcDate2[8]&0x0F)*10 +  
			  (pcDate2[9]&0x0F); 
 
	return IntDateCmp(iYear1, iMonth1, iDay1, iYear2, iMonth2, iDay2); 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
//计算lrc 
// 
// 
////////////////////////////////////////////////////////////////////// 
ARITHDLL_API BYTE WINAPI LRC(BYTE *pBuf, int iBufLen) 
{ 
	BYTE byLRC; 
 
	byLRC = 0; 
	for(int i=0; i