LZW编解码

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;

template 
class Lzw
{
public:
	static bool Encode(const string &,const string &);
	static bool Decode(const string &,const string &);
	//不管是时间还是空间,都输给了ZIP...
};
template 
bool Lzw::Encode(const string &src,const string &dest)
{
	//dict 初始化,prefix 初始化
	map dict;
	CODE num=0;
	for(num=0;num<128;num++)
	{
		string newItem(1,char(num));
		dict[newItem]=num;
	}
	string prefix("");
	FILE * fSrc=fopen(src.c_str(),"r");
	FILE * fDest=fopen(dest.c_str(),"wb+");
	//算法主体
	char cur;//当前字符
	while(fread(&cur,sizeof(char),1,fSrc) && !feof(fSrc))
	{
		string tmp(1,cur);
		string prefixPlusCur=prefix+tmp;
		if(dict.count(prefixPlusCur))
		{
			prefix.push_back(cur);
		}
		else
		{
			fwrite(&dict[prefix],sizeof(CODE),1,fDest);
			dict[prefixPlusCur]=num;
			num++;
			prefix=tmp;
		}
	};
	fwrite(&dict[prefix],sizeof(CODE),1,fDest);
	fclose(fSrc);
	fclose(fDest);
	return true;
}
template 
bool Lzw::Decode(const string &src,const string &dest)
{
	//dict 初始化
	map dict;
	CODE num=0;
	for(num=0;num<128;num++)
	{
		string newItem(1,char(num));
		dict[num]=newItem;
	}
	FILE *fin=fopen(src.c_str(),"rb");
	ofstream outfile;
	outfile.open(dest.c_str(),ofstream::out);
	CODE cur;
	fread(&cur,sizeof(CODE),1,fin);
	outfile<::Encode(src,dest);
  Lzw::Decode(dest,test);
  return 0;
}

//结果截图

LZW编解码_第1张图片LZW编解码_第2张图片

//还是不如ZIP...

你可能感兴趣的:(好玩)