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

📄 lzdecode.cpp

📁 lz编码与解码的c++实现
💻 CPP
字号:
#include<stdio.h>
#include<map>
#include<iostream>
#include<fstream>
#include"MyWord.h"

#define INTMAX 2147483647

using namespace std;

typedef map <long, MyWord> MyDic;

void lzdecode(ifstream& lzifs, ofstream& lzofs);
void write(MyDic & dic, long code, ofstream & lzofs);

int main(int arg,char* argv[]){
	if(arg < 2) printf("请输入压缩源文件。\n格式如下:\nLzDecode 解压源文件名\n");//检查参数正确性
	else{
		ifstream lzifs;
		lzifs.open(argv[1],ios::in|ios::binary);
		if(!lzifs) printf("解压源文件不存在。\n");//检查源文件
		else{
			printf("Processing,please wait...\n");
			ofstream lzofs;
			string ofname;
			ofname.assign(argv[1]);
			ofname.assign(ofname.substr(0,ofname.find_last_of('.')));
			lzofs.open(ofname.c_str(),ios::out|ios::binary);
			lzdecode(lzifs,lzofs);
			lzifs.close();
			lzofs.flush();
			lzofs.close();
			printf("ok!\n");
		}
	}
	return 0;
}

void lzdecode(ifstream& lzifs, ofstream& lzofs){
	MyDic dic;
	long no = 1;//全局,字典索引
	char rd = 0;
	MyWord * word = new MyWord();
	long code = 0;
	short stemp = 0;


	while(lzifs.read((char*)&stemp,2)){//读取一个short,2bit
		if(stemp < 0){//如果为正这该索引为short,如果为负则为int,继续读取下2个字节
			code = (((long)stemp)<<16)&INTMAX;
			lzifs.read((char*)&stemp,2);
			code += ((long)stemp) &((1 << 16) - 1);
		}
		else code = (int)stemp;
		if(code != 0){
			write(dic, code, lzofs);//如果索引不为0,则写入该索引在字典中的值
		}
		if(lzifs.get(rd)){
			lzofs.put(rd);//写入条目中的新加字节
			word->index = code; //编辑当前条目
			word->ch = rd;
			dic.insert(MyDic::value_type(no,*word)); //将该条目加入字典,重建字典
			no++;//全局索引加1
			delete word;
			word = new MyWord();//新建条目
		}
	}
	if(!word) delete word;
}

void write(MyDic & dic, long code, ofstream & lzofs){
	MyWord word = dic[code];
	if(word.index != 0) 
		write(dic, word.index, lzofs);
	lzofs.put(word.ch);
}

⌨️ 快捷键说明

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