📄 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 && 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 + -