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

📄 libfile.cpp

📁 编写一个电子签名的小程序
💻 CPP
字号:
#include "stdafx.h"
#include <afx.h>
#include "libFile.h"
//#include <windows.h>
//#include <iostream.h>
#include "Shlwapi.h"
#include "chaoge.h"


extern ULONG   ulBeginAddr,ulEndAddr,ulSignAddr,ulCmpLen,ulLen;
extern CString csSignFileBuff;

unsigned int KMP_Find_Part(unsigned char*pSource,
					unsigned char*pPart, unsigned int PrtLen)
{
	unsigned int uiI=0;
	unsigned char ucResult=0x00;
	
	for(uiI=0; uiI<PrtLen; uiI++)
	{
		if(pSource[uiI] != pPart[uiI])
		{
			ucResult = 0x01;
			break;
		}
	}
	return ucResult;
}			
unsigned int KMP_Find_Source(unsigned char*pSource,unsigned int ScLen, 
			unsigned char*pPart,  unsigned int PrtLen,unsigned int*pIndex)
{
	unsigned int uiI=0;
	unsigned char aucMid[64];
	unsigned char ucResult=0x02;
	
	if(ScLen < PrtLen)
	{
		return ucResult;
	}
	
	for(uiI=0; uiI<ScLen-PrtLen+1; uiI++)
	{
		memset(aucMid,0,sizeof(aucMid));
		memcpy(aucMid,&pSource[uiI], PrtLen);
		
		ucResult = KMP_Find_Part(aucMid,pPart,PrtLen);
		if(ucResult == 0)
		{
			*pIndex  = uiI;
			break;
		}
	}
	if(ucResult != 0)
	{
		ucResult = 0x02;
	}
	
	return ucResult;
}
int Os_StringToHex(unsigned char * sIndata,unsigned int InLen,
			unsigned char * OutData, unsigned int *OutLen)
{
	unsigned char aucIndata[1024];
	unsigned char aucOutBuf[3*1024];
	unsigned int uiI=0,uiJ=0;
	memset(aucIndata,0,sizeof(aucIndata));
	memset(aucOutBuf,0,sizeof(aucOutBuf));
	
	memcpy(aucIndata,sIndata, InLen);
	for(uiI=0; uiI<InLen; uiI++)
	{
		if(uiI%16 == 0)
		{
			aucOutBuf[uiJ++] = 0x0D;
			aucOutBuf[uiJ++] = 0x0A;
		}
		
		aucOutBuf[uiJ++] = ((aucIndata[uiI]&0xF0)>>4)+0x30;
		
		aucOutBuf[uiJ++] = (aucIndata[uiI]&0x0F) + 0x30;
		
		aucOutBuf[uiJ++] = ' ';
	}
	aucOutBuf[uiJ++] = 0x0D;
	aucOutBuf[uiJ++] = 0x0A;
	*OutLen = uiJ;
	
	uiI =0;	
	while(uiI < uiJ)
	{
		if(aucOutBuf[uiI] >= 0x3A)
			aucOutBuf[uiI] += 7;
		
		uiI++;
	}	
	memcpy(OutData,aucOutBuf,uiJ);
	
	return 0;
}
int Os_CheckFileExist(CString sFile)
{
	int iResult = ERR_FILE_NOTEXIST;
	CFileStatus status;
	if (CFile::GetStatus(sFile,status))	
	{
		iResult = 0x00;
	}
	return iResult;
}


int Os_CreatFolder(CString sDirName)
{	//创建文件夹
	int iResult = 0;
	BOOL bFileFlag;
	char aucDirName[MAX_PATH];
	DWORD nLastErr;	
	
	memset( aucDirName,0,sizeof(aucDirName) );
	strcpy( aucDirName,sDirName);
	bFileFlag = CreateDirectory(aucDirName,NULL );//创建成功,返回值非0
	if( !bFileFlag )
	{
		iResult = ERR_FILE_NOTEXIST;

		nLastErr = GetLastError();
		if( nLastErr != ERROR_ALREADY_EXISTS )
			return nLastErr;
	}
	return iResult;
}

BOOL  Os_CheckFolderExist(LPCTSTR   lpszPath)   
{   
  WIN32_FIND_DATA   wfd;   
  BOOL   	bRet;   
  HANDLE   hFind;   
  hFind  = FindFirstFile(lpszPath,&wfd);   
  bRet   =(hFind!=INVALID_HANDLE_VALUE)   
  		&&(wfd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY);   
  
  FindClose(hFind);   
  return   bRet;   
}

//创建文件
int Os_CreatFile(CString sFile)
{
	int iResult;	
	
	CStdioFile file;

	iResult = ERR_FILE_NOTEXIST;
	iResult = Os_CheckFileExist(sFile);
	if(iResult != 0)
	{
		if(!file.Open(sFile,CFile::modeWrite|CFile::typeText) )
		{
			if(file.Open(sFile,CFile::modeCreate|CFile::modeWrite|CFile::typeText) )
			{
				iResult = 0x00;				
			}else
			{
				iResult = ERR_FILE_CREATERR;				
			}
		}	
		file.Close();
	}
	return iResult;
}
int Os_ReadFile(CString sFile, char *sOutData,int *iOutLen)
{
	int iResult = ERR_FILE_NOTEXIST;			
	CStdioFile file;

	BYTE str[410];

	DWORD m_nLen;
	iResult = Os_CheckFileExist(sFile);
	if(iResult == 0)
	{
		//读文件	
		if(file.Open(sFile, CFile::modeRead | CFile::typeText))
		{
			iResult = 0x00;
		}else
		{
		  	iResult = ERR_FILE_OPENERR;
		}
	
		if(iResult == 0x00)
		{
			m_nLen = file.GetLength();
			*iOutLen = m_nLen;
			
			memset(str,0,sizeof(str));
			file.Read(str,m_nLen);
			memcpy(sOutData,str,m_nLen);
		}
		file.Close();
	}
	
	return iResult;
}

int Os_ReadFileByString(CString sFile)
{
	int iResult = ERR_FILE_NOTEXIST;			
	unsigned int uiLineLen=0;
	unsigned char aucLineBuf[50];

	CStdioFile file;
	CString str;	
	UINT uiOutDataLen=0;
	UINT uiDataLen=0;
	UCHAR aucLineAddr[5];
	CString sAddr;
	ULONG ulLineAddr;
	CHAR aucOutData[255];//FILE_MAX_LEN
	CString csData;

	csData = "";
	
	memset(aucOutData,0,sizeof(aucOutData));
	iResult = Os_CheckFileExist(sFile);
	if(iResult == 0)
	{		
		//读文件
		iResult = ERR_FILE_OPENERR;
		if(file.Open(sFile, CFile::modeRead | CFile::typeText))
		{
			iResult = 0x00;
		}
	}
	if(iResult == 0)
	{		
		while(file.ReadString(str)) 
		{ 
			//行中的数据
			uiLineLen = str.GetLength();
			memset(aucLineBuf,0,sizeof(aucLineBuf));			
			memcpy(aucLineBuf,str.GetBuffer(0), uiLineLen);
			//判断数据的长度,起始字节
			iResult = 0X10;
			if(uiLineLen >= 11)
			{
				iResult = 0X11;
				if (aucLineBuf[0] == ':')
				{
					iResult = 0;
				}				
			}
			
			if (iResult == 0)
			{
				//该行数据的长度					
				uiDataLen = (aucLineBuf[1]-0x30)*16 + (aucLineBuf[2]-0x30);					
				//数据的地址					
				memset(aucLineAddr,0,sizeof(aucLineAddr));
				memcpy(aucLineAddr,&aucLineBuf[3],4);
				sAddr = aucLineAddr;
				ulLineAddr = Os_ComputeAddr(sAddr);
				//判断数据长度
				iResult = 0x12;
				if((ulLineAddr >= ulBeginAddr)
				&& (ulLineAddr <  ulEndAddr)
				)
				{
					iResult = 0;
				}else
				{
					iResult = 0xFF;
				}
			}
			
			if (iResult == 0)
			{
				//取数据
				if((aucLineBuf[7] == '0')
				&& (aucLineBuf[8] == '0')
				)
				{
					uiDataLen = uiDataLen*2;
					//memset(&aucOutData[uiOutDataLen],0, uiDataLen);
					//memcpy(&aucOutData[uiOutDataLen], &aucLineBuf[9], uiDataLen);
					memset(&aucOutData[0],0, sizeof(aucOutData));
					memcpy(&aucOutData[0],&aucLineBuf[9], uiDataLen);
					
					csData = csData + aucOutData;

					uiOutDataLen += uiDataLen;
				}
			}else break;

			str = "";

		}//end while
		if((iResult==0)||(iResult == 0XFF)||(uiLineLen == 0))
		{
			//将数据导出
			if (uiOutDataLen > 0)
			{
				//memcpy(sOutData,aucOutData,uiOutDataLen);
				//*iOutLen = uiOutDataLen;
				//csSignFileBuff = aucOutData;
				csSignFileBuff = "";
				csSignFileBuff = csData;
			}
			iResult = 0;
			if (uiOutDataLen == 0)
			{
				iResult = 0XFE;
			}
		}	
	}
	
	file.Close();
	return iResult;
}

int Os_WriteFile(CString sFile, CString sInData,int InDataLen)
{
	int iResult = ERR_FILE_NOTEXIST;			
	CStdioFile file;
	//读文件	
	iResult = Os_CheckFileExist(sFile);
	if(iResult == 0)
	{	
		if(file.Open(sFile, CFile::modeWrite | CFile::typeText))
		{
			iResult = 0x00;
		}else
		{
		 	iResult = ERR_FILE_OPENERR;	
		}
		//清空文件中的数据
		//file.SetLength(0);
		file.SeekToEnd();
		file.Write(sInData,InDataLen);
		file.Close();
	}
	return iResult;
}

int Os_WriteFileHEX(CString sFile, unsigned char * pInData,int InDataLen)
{
	int iResult = ERR_FILE_NOTEXIST;			
	CStdioFile file;
	//读文件	
	iResult = Os_CheckFileExist(sFile);
	if(iResult == 0)
	{	
		if(file.Open(sFile, CFile::modeWrite | CFile::typeText))
		{
			iResult = 0x00;
		}else
		{
		 	iResult = ERR_FILE_OPENERR;	
		}
		//清空文件中的数据
		//file.SetLength(0);
		//将数据转化为HEX码形式写日志
		unsigned char sOutData[3*1024];
		unsigned int OutLen=0;
	
		memset(sOutData,0,sizeof(sOutData));
		Os_StringToHex(pInData,InDataLen,sOutData,&OutLen);
		
		//sInData = sOutData;

		file.SeekToEnd();
		file.Write(sOutData,OutLen);
		file.Close();
	}
	return iResult;
}

//对文件的匹配查找;
//TCP_PORT = 9001;
int Os_GetParameterString(CString sFileName,CString sMachOne,char* pOutData,int *iOutLen)
{
	int iResult,uiI,iCompLen;
	int iLen,iOffset,iBegin,iOLen;
	char aucOutBuf[FILE_MAX_LEN];
	char aucMbuf[20];
	
	char aucMidOutBuf[30];		
	char aucMidBuf[FILE_MAX_LEN];
	int uiJ=0;
			
	iResult = Os_ReadFile(sFileName,aucOutBuf,&iLen);
	if(iResult == 0)
	{
		//首先删除注释部分;
		memset(aucMidBuf,0,FILE_MAX_LEN);
		for(uiI=0; uiI < iLen ; uiI++)	
		{
			if((aucOutBuf[uiI] == '/')&&(aucOutBuf[uiI+1] == '*'))
			{
				while(!((aucOutBuf[uiI] == '*')&&(aucOutBuf[uiI+1] == '/')))
				{
					uiI++;	
				}		
				uiI++;		
			}						
			if(((aucOutBuf[uiI] == '/')&&(aucOutBuf[uiI+1] == '/') )
			 ||(aucOutBuf[uiI] == '#')
			 ||(aucOutBuf[uiI] == '[')
			)
			{
				while(aucOutBuf[uiI] != '\n')//((!((aucOutBuf[uiI] == 0x0D)&&(aucOutBuf[uiI+1] == 0x0A)))
				{
					uiI++;	
				}		
				uiI++;		
			}
			aucMidBuf[uiJ++] = aucOutBuf[uiI];
		}		
		memset(aucOutBuf,0,FILE_MAX_LEN);
		memcpy(aucOutBuf,aucMidBuf,uiJ);
		iLen = uiJ;
		
		//比较字符串	
		iCompLen = strlen(sMachOne);
		for(uiI=0; uiI < iLen ; uiI++)		
		{
			memset(aucMbuf,0,sizeof(aucMbuf));
			memcpy(aucMbuf,&aucOutBuf[uiI],iCompLen);
			if(memicmp(aucMbuf, sMachOne,iCompLen) == 0)	//strcmp
			{
				break;		
			}
		}
		
		//查找'='
		iBegin = uiI+sizeof(sMachOne);
		for(uiI=iBegin; uiI<iLen; uiI++)
			if(aucOutBuf[uiI] == '=')
				break;
		
		//寻找起始字节		
		iBegin = uiI+1;		
		for(uiI=iBegin; uiI<iLen; uiI++)
			if(aucOutBuf[uiI] != ' ')
				break;
		
		//计算数据长度
		iBegin = uiI;
		iOffset = uiI;	
		iOLen = 0;
		for(uiI=iBegin; uiI<iLen; uiI++)
		{
			if(aucOutBuf[uiI] == ';')
				break;	
			
			iOLen++;	
		}
		//COPY 字符串	
		memset(aucMidOutBuf,0,30);
		*iOutLen = iOLen;
		memcpy(aucMidOutBuf,&aucOutBuf[iOffset],iOLen);		
		//*iOutLen = Os_TrimStr(aucMidOutBuf,pOutData);
		int uiJ=0;
		
		memset(aucMbuf,0,sizeof(aucMbuf));
		//pOutData = aucMbuf;
		for(uiI=0; uiI< (int)strlen(aucMidOutBuf); uiI++)
		{
			if(aucMidOutBuf[uiI]!=' ')	
				pOutData[uiJ++] = aucMidOutBuf[uiI];
		}
		*iOutLen = uiJ;
	
		
	}
	return iResult;
}

int Os_TrimStr(CString sInData,char *pOutData)
{
	unsigned int uiI,uiJ=0;
	char aucOutBuf[30];
	
	for(uiI=0; uiI< strlen(sInData); uiI++)
	{
		//if(sInData[uiI]!=' ')	
		//	aucOutBuf[uiJ++] = sInData[uiI];
	}
	memcpy(pOutData,aucOutBuf,uiJ);
	return uiJ;
}
long Os_ComputeAddr(CString sInData)
{
	long uiLen=0;	
	UCHAR aucOutBuf[5],aucLen[3];
	
	memset(aucOutBuf,0,sizeof(aucOutBuf));
	memcpy(aucOutBuf,sInData.GetBuffer(0), 4);
	asc_hex(aucLen,2,aucOutBuf,4);

	uiLen = aucLen[0]*256 + aucLen[1];

	return uiLen;
}
int Os_GetFolderFileDir(CString sFolderName,CString sFileName,char* pOutData)
{
	char aucDirName[60];
	memset(aucDirName,0,sizeof(aucDirName));
	
	memcpy(aucDirName,sFolderName,strlen(sFolderName));
	aucDirName[strlen(sFolderName)] = '\\';
	memcpy(&aucDirName[strlen(sFolderName)+1],sFileName,strlen(sFileName));
	
	memcpy(pOutData,aucDirName,strlen(aucDirName));
	return strlen(aucDirName);
}
UCHAR Conv(UCHAR Oct)
{
	if (Oct >= 0x41)
		return ( (Oct - 7) & 0x0F );
	else
		return ( Oct & 0x0F );
}
UCHAR *asc_hex(UCHAR *Ptd ,ULONG Ld,UCHAR *Pts,ULONG Ls)
{
	ULONG I;
	
	(VOID) memset( Ptd, 0x00, Ld ) ;
	
    Ptd = Ptd + Ld - ((Ls + 1) / 2) ;
    if ( Ls % 2 ) *Ptd++ = Conv(*Pts++) & 0x0F ;
    for ( I = 0 ; I < (Ls / 2) ; I++)
    {
		*Ptd =  (Conv(*Pts++) << 4) & 0xF0 ;
		*Ptd = *Ptd + (Conv(*Pts++) & 0x0F)  ;
		Ptd ++;
    }
	return((UCHAR*)Ptd);
}
UCHAR *hex_asc(UCHAR * Ptd, UCHAR*Pts, UINT  Lg)
{
	UCHAR I, *Pt0;
	
	Pt0 = Ptd;
	if(Lg%2)*Ptd++ = (*Pts++&0x0F) + 0x30;
	for(I=0; I < (Lg/2); I++)	
	{
		*Ptd++ = ((*Pts&0xF0)>>4)+0x30;
		*Ptd++ = (*Pts++&0x0F)+0x30;
	}
	
	while( Pt0 != Ptd)
	{
		if(*Pt0 >= 0x3A) *Pt0 += 7;
			
		Pt0++;
	}
	return ((UCHAR*) Ptd);
}

⌨️ 快捷键说明

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