📄 lzwfile.cpp
字号:
CFile fileIn(pszInFile,
CFile::modeRead|CFile::typeBinary);
CFile fileOut(pszOutFile,
CFile::modeReadWrite|CFile::typeBinary);
pfileOut=&fileOut;
pfileIn=&fileIn;
LZWFILEHEAD LZWFileHead;//(LZW_FILE_TAG,(9<<8)|0,1);
fileOut.Read(&LZWFileHead,sizeof(LZWFILEHEAD));
LZWFileHead.dwFileCount++;
fileOut.SeekToBegin();
fileOut.Write(&LZWFileHead,sizeof(LZWFILEHEAD));
fileOut.SeekToEnd();
LZWSINGLEFILEHEAD LZWSingleFileHead;/*(LZW_SINGLE_FILE_TAG,
0,
dwOldFileLength,
0,
strlen(pszInFile));*/
DWORD dwFileOldLength=fileIn.GetLength();
LZWSingleFileHead.wSingleFileTag=LZW_SINGLE_FILE_TAG;
LZWSingleFileHead.dwAttribute=0;
LZWSingleFileHead.dwFileOldLength=dwFileOldLength;
dwEncodeGetTotal=dwFileOldLength;
int iFileNamePos=FindFileName(pszInFile);
LZWSingleFileHead.wFileNameLength=strlen(pszInFile+iFileNamePos);
fileOut.Write(&LZWSingleFileHead,sizeof(LZWSINGLEFILEHEAD));
fileOut.Write(pszInFile+iFileNamePos,strlen(pszInFile+iFileNamePos));
if(dwFileOldLength!=0)
{
CLZWEncode *pEncode=new CLZWEncode();
pEncode->BeginLZWEncode(dwFileOldLength,
EncodeGetNextByte,
EncodePutNextBytes,
1024,
(dwFileOldLength>1000)?pfunEncodedBytes:NULL,
dwFileOldLength/100);
pEncode->EndLZWEncode(EncodePutNextBytes);
LZWSingleFileHead.dwFileCompressedLength=
(DWORD)pEncode->GetCompressedLength();
DWORD dwCurrentPos=fileOut.GetPosition();
DWORD dwLastSingleFileHeadPos=dwCurrentPos
-LZWSingleFileHead.dwFileCompressedLength
-LZWSingleFileHead.wFileNameLength
-sizeof(LZWSINGLEFILEHEAD);
//fileOut.Flush();
/*fileOut.Close();
fileOut.Open(pszOutFile,
CFile::modeWrite|CFile::typeBinary);*/
fileOut.Seek(dwLastSingleFileHeadPos,CFile::begin);
fileOut.Write(&LZWSingleFileHead,sizeof(LZWSINGLEFILEHEAD));
fileOut.Seek(dwCurrentPos,CFile::begin);
fileOut.Flush();
//fileOut.Seek(0,CFile::end);
delete pEncode;
}
fileOut.Close();
fileIn.Close();
return TRUE;
}
BOOL LZWEncodeFile(LPCSTR pszInFile,LPCSTR pszOutFile,
FUN_LZWENCODEDBYTES pfunEncodedBytes)
{
iEncodeGetPos=0;
CFile fileIn(pszInFile,
CFile::modeRead|CFile::typeBinary);
CFile fileOut(pszOutFile,
CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
pfileOut=&fileOut;
pfileIn=&fileIn;
LZWFILEHEAD LZWFileHead;//(LZW_FILE_TAG,(9<<8)|0,1);
LZWFileHead.dwFileTag=LZW_FILE_TAG;
LZWFileHead.wVersion=(0<<8)|10;
LZWFileHead.dwFileCount=1;
fileOut.Write(&LZWFileHead,sizeof(LZWFILEHEAD));
LZWNODEHEAD LZWNodeHead;//(LZW_NODE_TAG,LZW_BEGIN_COMPRESS,0);
LZWNodeHead.wNodeTag=LZW_NODE_TAG;
LZWNodeHead.wDirectoryType=LZW_NODE_BEGIN_COMPRESS;
LZWNodeHead.wDirectoryNameLength=0;
fileOut.Write(&LZWNodeHead,sizeof(LZWNODEHEAD));
LZWSINGLEFILEHEAD LZWSingleFileHead;/*(LZW_SINGLE_FILE_TAG,
0,
dwOldFileLength,
0,
strlen(pszInFile));*/
DWORD dwFileOldLength=fileIn.GetLength();
LZWSingleFileHead.wSingleFileTag=LZW_SINGLE_FILE_TAG;
LZWSingleFileHead.dwAttribute=0;
LZWSingleFileHead.dwFileOldLength=dwFileOldLength;
dwEncodeGetTotal=dwFileOldLength;
int iFileNamePos=FindFileName(pszInFile);
LZWSingleFileHead.wFileNameLength=strlen(pszInFile+iFileNamePos);
fileOut.Write(&LZWSingleFileHead,sizeof(LZWSINGLEFILEHEAD));
fileOut.Write(pszInFile+iFileNamePos,strlen(pszInFile+iFileNamePos));
if(dwFileOldLength!=0)
{
CLZWEncode *pEncode=new CLZWEncode();
pEncode->BeginLZWEncode(dwFileOldLength,
EncodeGetNextByte,
EncodePutNextBytes,
1024,
(dwFileOldLength>1000)?pfunEncodedBytes:NULL,
dwFileOldLength/100);
pEncode->EndLZWEncode(EncodePutNextBytes);
LZWSingleFileHead.dwFileCompressedLength=
(DWORD)pEncode->GetCompressedLength();
DWORD dwCurrentPos=fileOut.GetPosition();
DWORD dwLastSingleFileHeadPos=dwCurrentPos
-LZWSingleFileHead.dwFileCompressedLength
-LZWSingleFileHead.wFileNameLength
-sizeof(LZWSINGLEFILEHEAD);
//fileOut.Flush();
/*fileOut.Close();
fileOut.Open(pszOutFile,
CFile::modeWrite|CFile::typeBinary);*/
fileOut.Seek(dwLastSingleFileHeadPos,CFile::begin);
fileOut.Write(&LZWSingleFileHead,sizeof(LZWSINGLEFILEHEAD));
fileOut.Seek(dwCurrentPos,CFile::begin);
fileOut.Flush();
//fileOut.Seek(0,CFile::end);
delete pEncode;
}
fileOut.Close();
fileIn.Close();
return TRUE;
}
/*BOOL LZWDecodeFile(LPCSTR pszInFile,LPCSTR pszOutFile)
{
return FALSE;
}*/
BOOL LZWParseFileHead(LPCSTR pszInFile,CString* pszOut)
{
DWORD dwCount=0;
CString szOut(pszInFile);
char szTemp[1000];
CFile fileIn(pszInFile,
CFile::modeRead|CFile::typeBinary);
DWORD dwFileLength=fileIn.GetLength();
if(dwFileLength
<(sizeof(LZWFILEHEAD)+sizeof(LZWNODEHEAD)+sizeof(LZWSINGLEFILEHEAD)))
{
AfxMessageBox("error file format");
return FALSE;
}
LZWFILEHEAD LZWFileHead;
fileIn.Read(&LZWFileHead,sizeof(LZWFILEHEAD));
if(LZWFileHead.dwFileTag!=LZW_FILE_TAG)
{
AfxMessageBox("not hglz file");
fileIn.Close();
return FALSE;
}
szOut+="\n";
sprintf(szTemp,
"version %d.%d\nfile count %d\n",
HIBYTE(LZWFileHead.wVersion),
LOBYTE(LZWFileHead.wVersion),
LZWFileHead.dwFileCount);
szOut+=szTemp;
dwCount=LZWFileHead.dwFileCount;
LZWNODEHEAD LZWNodeHead;
fileIn.Read(&LZWNodeHead,sizeof(LZWNODEHEAD));
if(LZWNodeHead.wNodeTag!=LZW_NODE_TAG)
{
AfxMessageBox("not hglz file node");
fileIn.Close();
return FALSE;
}
if(LZWNodeHead.wDirectoryNameLength!=0)
{
ASSERT(0);
}
for(DWORD d=0;d<dwCount;d++)
{
LZWSINGLEFILEHEAD LZWSingleFileHead;
fileIn.Read(&LZWSingleFileHead,sizeof(LZWSINGLEFILEHEAD));
DWORD dwPos=fileIn.GetPosition();
if(LZWSingleFileHead.wSingleFileTag!=LZW_SINGLE_FILE_TAG)
{
AfxMessageBox("not hglz single file head");
fileIn.Close();
return FALSE;
}
szOut+="file:";
fileIn.Read(szTemp,LZWSingleFileHead.wFileNameLength);
szTemp[LZWSingleFileHead.wFileNameLength]='\0';
szOut+=szTemp;
szOut+=" ";
sprintf(szTemp,"ratio %.2f%%\n",
(100*(float)LZWSingleFileHead.dwFileCompressedLength)
/(float)LZWSingleFileHead.dwFileOldLength);
szOut+=szTemp;
dwPos+=LZWSingleFileHead.dwFileCompressedLength;
dwPos+=LZWSingleFileHead.wFileNameLength;
fileIn.Seek(dwPos,CFile::begin);
}
if(pszOut)
*pszOut=szOut;
else
AfxMessageBox(szOut);
fileIn.Close();
return TRUE;
}
BOOL LZWParseFileHead(LPCSTR pszInFile,CStringArray &szNameArray)
{
DWORD dwCount=0;
CString szOut(pszInFile);
char szTemp[1000];
CFile fileIn(pszInFile,
CFile::modeRead|CFile::typeBinary);
DWORD dwFileLength=fileIn.GetLength();
if(dwFileLength
<(sizeof(LZWFILEHEAD)+sizeof(LZWNODEHEAD)+sizeof(LZWSINGLEFILEHEAD)))
{
AfxMessageBox("error file format");
return FALSE;
}
LZWFILEHEAD LZWFileHead;
fileIn.Read(&LZWFileHead,sizeof(LZWFILEHEAD));
if(LZWFileHead.dwFileTag!=LZW_FILE_TAG)
{
AfxMessageBox("not hglz file");
fileIn.Close();
return FALSE;
}
szOut+="\n";
sprintf(szTemp,
"version %d.%d\nfile count %d\n",
HIBYTE(LZWFileHead.wVersion),
LOBYTE(LZWFileHead.wVersion),
LZWFileHead.dwFileCount);
szOut+=szTemp;
dwCount=LZWFileHead.dwFileCount;
LZWNODEHEAD LZWNodeHead;
fileIn.Read(&LZWNodeHead,sizeof(LZWNODEHEAD));
if(LZWNodeHead.wNodeTag!=LZW_NODE_TAG)
{
AfxMessageBox("not hglz file node");
fileIn.Close();
return FALSE;
}
if(LZWNodeHead.wDirectoryNameLength!=0)
{
ASSERT(0);
}
for(DWORD d=0;d<dwCount;d++)
{
LZWSINGLEFILEHEAD LZWSingleFileHead;
fileIn.Read(&LZWSingleFileHead,sizeof(LZWSINGLEFILEHEAD));
DWORD dwPos=fileIn.GetPosition();
if(LZWSingleFileHead.wSingleFileTag!=LZW_SINGLE_FILE_TAG)
{
AfxMessageBox("not hglz single file head");
fileIn.Close();
return FALSE;
}
szOut+="file:";
fileIn.Read(szTemp,LZWSingleFileHead.wFileNameLength);
szTemp[LZWSingleFileHead.wFileNameLength]='\0';
szNameArray.Add(szTemp);
szOut+=szTemp;
szOut+=" ";
sprintf(szTemp,"ratio %.2f%%\n",
(100*(float)LZWSingleFileHead.dwFileCompressedLength)
/(float)LZWSingleFileHead.dwFileOldLength);
szOut+=szTemp;
dwPos+=LZWSingleFileHead.dwFileCompressedLength;
dwPos+=LZWSingleFileHead.wFileNameLength;
fileIn.Seek(dwPos,CFile::begin);
}
fileIn.Close();
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -