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

📄 rleunzip.cpp

📁 压缩及解压基本工具
💻 CPP
字号:
// rleunzip.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#include <iostream.h>
#include <fstream.h>
#include <string.h>
#include <stdio.h>

char contents[10000000];
char unziped[10000000];

void unzip(char *zipFileName);
void unzipDir(ifstream &zipfile, char *dirName, long number);
void unzipFile(ifstream &zipfile, char *fileName, long length);
void unzip(char *source, long sourcelen, char * dest, long & destlen);

int main(int argc, char* argv[])
{
	if(argc!=2) return -1;
	unzip(argv[1]);
	return 0;
}

void unzip(char *zipFileName ){
	ifstream  zipfile(zipFileName, ios::ate|ios::binary);
    char fileType;
	char fileName[1000];
	long length;
    zipfile.seekg(0,ios::beg);
    zipfile.read(reinterpret_cast<char *>(&fileType),1);
    zipfile.read(reinterpret_cast<char *>(fileName),256);
    zipfile.read(reinterpret_cast<char *>(&length),sizeof(long));
	if(fileType == 'f')
		unzipFile(zipfile, fileName,length);
	else unzipDir(zipfile,fileName,length);  
	zipfile.close();
}
void unzipDir(ifstream &zipfile, char *dirName, long number){
    int i;
	cout << "dir =" << dirName << "  " << number << endl;
	if(dirName[strlen(dirName)-1] == '*'){
        dirName[strlen(dirName)-1] = '\0' ; 
		CreateDirectory(dirName, NULL);
	}
	for(i=0;i<number;i++){
        char type;
	    char fileName[1000];
	    long length;
        zipfile.read(reinterpret_cast<char *>(&type),sizeof(char));
        zipfile.read(reinterpret_cast<char *>(fileName),256);
        zipfile.read(reinterpret_cast<char *>(&length),sizeof(long));
	    if(type == 'f')
		   unzipFile(zipfile, fileName,length);
	    else unzipDir(zipfile,fileName,length);  
    }
}
void unzipFile(ifstream &zipfile, char *fileName, long length){
   cout << "file " << fileName << endl;
   ofstream fout(fileName, ios::out|ios::binary);
   zipfile.read(reinterpret_cast<char *>(contents),length);
   long destlen;
   unzip(contents, length, unziped, destlen);
   fout.write(reinterpret_cast<const char *>(unziped),destlen);
   fout.close();
}

void unzip(char *source, long sourcelen, char * dest, long & destlen){
	long i;
    destlen = 0;
	for(i=0;i<sourcelen;i=i+2){
		int count = (int)source[i];
        char content = source[i+1]; 
		for(int j=0;j<count;j++){
			dest[destlen] = content;
			destlen ++;
		}
	}
}

⌨️ 快捷键说明

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