⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 string.cpp

📁 DES,MD5,ZLIB算法源代码
💻 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 && i<ndad)
    {
        while((j!=-1) && (pcsub[j]!=pcdad[i]))
            j=iNext[j];
		j++; i++;
        if (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<iBufLen && iOffset<iMaxDestLen; i++, iOffset++)
		{
			if (pbyBuf[i]=='\\')
			{
				if ( iOffset+2 < iMaxDestLen )
				{
					pbyDest[iOffset] = '\\';
					pbyDest[iOffset+1] = '\\';
				}
				else break;
				++iOffset;
				continue;
			}
			if ( pbyBuf[i]>=' ' && pbyBuf[i]<=0x7E )
			{
				pbyDest[iOffset] = pbyBuf[i];
				continue;
			}
			if ( pbyBuf[i]>=0xA1 )
			{	//中文
				if ((i+1)<iBufLen  && pbyBuf[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 && iOffset<iMaxDestLen; i++,	iOffset++)
		{
			if (pbyBuf[i]!='\\')
			{
				pbyDest[iOffset] = pbyBuf[i];
				continue;
			}
			if ( ++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<iBufLen && iOffset<iMaxDestLen; i++,iOffset++)
		{
			if (pcBuf[i]!='{' && pcBuf[i]!=cSeparator)
			{
				pcDest[iOffset] = pcBuf[i];
				continue;
			}
			if ( iOffset+2 >= iMaxDestLen )
			{
				break;
			}
			pcDest[iOffset++] = '{';
			if ( pcBuf[i]=='{' )
			{
				pcDest[iOffset] = '{';
			}
			else
			{
				pcDest[iOffset] = '0';
			}
		}
	}
	else
	{	//还原分隔符
		for(i=0; i<iBufLen && iOffset<iMaxDestLen; i++, iOffset++)
		{
			if (pcBuf[i]!='{')
			{
				pcDest[iOffset] = pcBuf[i];
			}
			else if ((++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<iBufLen; i++)
		byLRC ^= pBuf[i];
	return byLRC;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -