導航:首頁 > 文件處理 > 文件的壓縮與解壓底層代碼

文件的壓縮與解壓底層代碼

發布時間:2023-01-11 05:55:17

① 求java壓縮文件目錄的源代碼

packagecom.io2.homework;

importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileNotFoundException;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.util.zip.ZipEntry;
importjava.util.zip.ZipOutputStream;

/*壓縮文件夾*/
publicclassMyMultipleFileZip
{
="F:/MyZip.zip";
privateStringsourceFilePath;
privateZipOutputStreamzos;
privateFileInputStreamfis;

publicMyMultipleFileZip(StringsourceFilePath)
{
try
{
this.sourceFilePath=sourceFilePath;
zos=newZipOutputStream(newFileOutputStream(currentZipFilePath));
//設定文件壓縮級別
zos.setLevel(9);
}catch(FileNotFoundExceptione)
{
e.printStackTrace();
}
}

//在當前條目中寫入具體內容
publicvoidwriteToEntryZip(StringfilePath)
{
try
{
fis=newFileInputStream(filePath);
}catch(FileNotFoundExceptione1)
{
e1.printStackTrace();
}
byte[]buff=newbyte[1024];
intlen=0;
try
{
while((len=fis.read(buff))!=-1)
{
zos.write(buff,0,len);
}
}catch(IOExceptione)
{
e.printStackTrace();
}finally
{
if(fis!=null)
try
{
fis.close();
}catch(IOExceptione)
{
e.printStackTrace();
}
}
}

//添加文件條目
publicvoidaddFileEntryZip(StringfileName)
{
try
{
zos.putNextEntry(newZipEntry(fileName));
}catch(IOExceptione)
{
e.printStackTrace();
}
}

(StringdirectoryName)
{
try
{
zos.putNextEntry(newZipEntry(directoryName+"/"));
}catch(IOExceptione)
{
e.printStackTrace();
}
}

//遍歷文件夾
publicvoidlistMyDirectory(StringfilePath)
{
Filef=newFile(filePath);
File[]files=f.listFiles();
if(files!=null)
{
for(FilecurrentFile:files)
{
//設置條目名稱(此步驟非常關鍵)
StringentryName=currentFile.getAbsolutePath().split(":")[1].substring(1);
//獲取文件物理路徑
StringabsolutePath=currentFile.getAbsolutePath();
if(currentFile.isDirectory())
{
addDirectoryEntryZip(entryName);
//進行遞歸調用
listMyDirectory(absolutePath);

}
else
{
addFileEntryZip(entryName);
writeToEntryZip(absolutePath);
}
}
}
}

//主要流程
publicvoidmainWorkFlow()
{
listMyDirectory(this.sourceFilePath);
if(zos!=null)
try
{
zos.close();
}catch(IOExceptione)
{
e.printStackTrace();
}
}

publicstaticvoidmain(String[]args)
{
newMyMultipleFileZip("F:/fountainDirectory").mainWorkFlow();
}
}

linuxqt解壓文件代碼

Linuxunzip命令用於解壓縮zip文件,unzip為.zip壓縮文件的解壓縮程序。語法參數:-c將解壓縮的結果顯示到屏幕上,並對字元做適當的轉換。-f更新現有的文件。-l顯示壓縮文件內所包含的文件。-p與-c參數類似,會將解壓縮的結果顯示到屏幕上,但不會執行任開發雲主機域名何的轉換。-t檢查壓縮文件是否正確。-u與-f參數類似,但是除了更新現有的文件外,也會將壓縮文件中的其他文件解壓縮到目錄中。-v執行是時顯示詳細的信息。-z僅顯示壓縮文件的備注文字。-a對文本文件進行必要的字元轉換。-b不要對文本文件進行字元轉換。-C壓縮文件中的文件名稱區分大小寫。-j不處理壓縮文件中原有的目錄路徑。-L將壓縮文件中的全部文件名改為小寫。-M將輸出結果送到more程序處理。-n解壓縮時不要覆蓋原有的文件。-o不必先詢問用戶,unzip執行後覆蓋原有文件。-P使用zip的密碼選項。-q執行時不顯示任何信息。-s將文件名中的空白字元轉換為底線字元。-V保留VMS的文件版本信息。-X解壓縮時同時回存文件原來的UID/GID。[.zip文件]指定.zip壓縮文件。[文件]指定要處理.zip壓縮文件中的哪些文件。-d指定文件解壓縮後所要存儲的目錄。-x指定不要處理.zip壓縮文件中的哪些文件。-Zunzip-Z等於執行zipinfo指令。

③ 如何使用bat批處理通過rar命令壓縮/解壓縮目錄

1、首先,右鍵單擊壓縮器圖標並選擇「打開屬性」。

④ 基於哈夫曼樹的文件壓縮/解壓程序 源代碼

哈夫曼的C++演算法

#define INT_MAX 10000
#define ENCODING_LENGTH 1000
#include "stdio.h"
#include "string.h"
#include "malloc.h"
typedef enum{none,left_child,right_child} Which;//標記是左孩子還是右孩子
typedef char Elemtype;
typedef struct TNode{
Elemtype letter;
int weight;
int parent;
Which sigh;
char *code;
}HTNode,*HuffmanTree;
int n;
char coding[50];//儲存代碼
char str[ENCODING_LENGTH];//保存要翻譯的句子
void InitTreeNode(HuffmanTree &HT)
{//初始前N個結點,後M-N個結點置空
int i;int w;char c;
int m=2*n-1;
HuffmanTree p;
HT=(HuffmanTree)malloc((m)*sizeof(HTNode));
printf("input %d database letter and weight",n);
p=HT;
getchar();
for (i=1;i<=n;i++){
scanf("%c%d",&c,&w);
p->code='\0';
p->letter=c;
p->parent=0;
p->sigh=none;
p->weight=w;
p++;
getchar();
}
for (;i<=m;i++,p++){
p->code='\0';
p->letter=' ';
p->parent=0;
p->sigh=none;
p->weight=0;
}
}//INITTREENODE
void Select(HuffmanTree HT,int end,int *s1,int *s2)
{//在0~END之間,找出最小和次小的兩個結點序號,返回S1,S2
int i;
int min1=INT_MAX;
int min2;
for (i=0;i<=end;i++){//找最小的結點序號
if (HT[i].parent==0&&HT[i].weight<min1){
*s1=i;
min1=HT[i].weight;
}
}
min2=INT_MAX;
for(i=0;i<=end;i++){//找次小結點的序號
if (HT[i].parent==0&&(*s1!=i)&&min2>HT[i].weight){
*s2=i;
min2=HT[i].weight;
}
}
}
void HuffmanTreeCreat(HuffmanTree &HT)
{//建立HUFFMAN樹
int i;int m=2*n-1;
int s1,s2;
for(i=n;i<m;i++){
Select(HT,i-1,&s1,&s2);
HT[s1].parent=i;
HT[s2].parent=i;
HT[s1].sigh=left_child;
HT[s2].sigh=right_child;
HT[i].weight=HT[s1].weight+HT[s2].weight;
}
}

void HuffmanTreeCode(HuffmanTree HT)
{//HUFFMAN解碼
int i;
char *temp;
temp=(char *)malloc(n*sizeof(char));
temp[n-1]='\0';
int p;int s;
for (i=0;i<n;i++){
p=i;
s=n-1;
while (HT[p].parent!=0){//從結點回溯,左孩子為0,右孩子為1
if (HT[p].sigh==left_child)
temp[--s]='0';
else if (HT[p].sigh==right_child)
temp[--s]='1';
p=HT[p].parent;
}
HT[i].code=(char *)malloc((n-s)*sizeof(char));//分配結點碼長度的內存空間
strcpy(HT[i].code,temp+s);
printf("%s\n",HT[i].code);
}
}
void GetCodingSen(char *sencence)
{//輸入要編碼的句子
int l;
gets(sencence);
l=strlen(sencence);
sencence[l]='\0';
}
void HuffmanTreeEncoding(char sen[],HuffmanTree HT)
{//將句子進行編碼
int i=0;int j;
while(sen[i]!='\0'){
for(j=0;j<n;j++){
if (HT[j].letter==sen[i]) //字母吻合則用代碼取代
{strcat(coding,HT[j].code);
break;
}
}
i++;
if (sen[i]==32) i++;
}
printf("\n%s",coding);
}
void HuffmanTreeDecoding(HuffmanTree HT,char code[])
{//HUFFMAN解碼過程,將代碼翻譯為句子
char sen[100];
char temp[50];
char voidstr[]=" ";
int i;int j;
int t=0;int s=0;
for(i=0;i<strlen(code);i++){
temp[t++]=code[i];
for(j=0;j<n;j++){
if (strcmp(HT[j].code,temp)==0){//代碼段吻合
sen[s]=HT[j].letter;s++;
strcpy(temp,voidstr);//將TEMP置空
t=0;
break;
}
}
}
printf("\n%s",sen);
}

void main()
{
HTNode hnode;
HuffmanTree huff;
huff=&hnode;
printf("input the letter for coding number\n");
scanf("%d",&n);
InitTreeNode(huff);
HuffmanTreeCreat(huff);
HuffmanTreeCode(huff);
GetCodingSen(str);
HuffmanTreeEncoding(str,huff);
HuffmanTreeDecoding(huff,coding);
}

⑤ Linux中壓縮與解壓縮:

(1)使用tar命令備份數據的格式如下:

$ tar cvf backup.tar /home/html

上述命令是將/home/html 目錄下的所有文件打包成tar文件backup.tar。

cvf是tar的命令參數。

c代表創建一個檔案文件,

v代表顯示每個備份的文件名字,

f表示tar創建的檔案文件名是後面的backup.tar,

/home/html 代表tar要備份的文件或和目錄名。

(2)使用tar命令恢復數據的格式如下:

$ tar xvf backup.tar

上述命令將備份文件backup.tar恢復到當前目錄下。

通常情況下,tar對文件進行備份的時候並不對文件進行壓縮,因此備份文件的尺寸非常大。使用如下的命令,將使tar在備份結束以後,自動使用gzip命令對備份文件進行壓縮,得到一個相應的gz文件。

$ tar zcvf backup.tar.gz /home/html

這樣,我們可以得到壓縮文件backup.tar.gz。
zip命令....

⑥ 用ASP實現在線壓縮與解壓縮

一 問題的提出 隨著互連網的發展 網站的數量以驚人的數字增加 網站的作用除了給廣大網友們提供信息資訊服務外 還應該成為網友們上傳與下載文件的場所 在上傳與下載文件的過程中 傳輸時間是關鍵 這就要求有較快的傳輸速度 在傳輸速度固定不變或是上下變動不大的情況下 盡量減小傳輸文件的體積 是一個可行的辦法 上傳文件的時候 先將要上傳的文件用WINRAR壓縮 上傳成功後在網站內通過程序實現解壓縮 下載文件的時候 先將要下載的文件在網站內通過程序實現壓縮然後再下載 本文就針對該問題的解決進行探討

二 方法與說明

首先要上傳一個WINRAR的解壓程序 就是WINRAR自己的解壓程序 只需要它的核心程序RAR EXE這個文件就可以了 在WINRAR的安裝目錄里可以找到 然後要上傳一個執行RAR EXE的程序 CMD EXE 這個是WINDOWS操作系統里的程序 在系統盤WINNT/SYSTEM 文件夾中可以找到 上傳完這兩個文件後 就需要編寫一些程序代碼來實現壓縮與解壓縮

不妨將實現壓縮功能的文件取名為ZIP ASP 實現解壓縮功能的文件取名為UNZIP ASP

程序代碼中包含了WINRAR這個應用程序的命令行語法 下面簡單介紹一下

WinRAR <命令> <開關 > <開關N> <壓縮文件> <文件……> <@列表文件……> <解壓路徑>

命令 要 WinRAR 運行的字元組合代表功能

開關 切換操作指定類型 壓縮強度 壓縮文件類型 等等的定義

壓縮文件 要處理的壓縮文件名

文件 要處理的文件名

列表文件 列表文件是包含要處理文件名稱的純文本 文件名應該在第一卷啟動 可以在列表文件中使用//字元後添加註釋 例如 你可以包含兩列字元串創建 backup lst c workdoc* txt //備份文本文檔 c workimage* bmp //備份圖片c workmisc並接著運行 winrar a backup @backup lst你可以在命令行中同時指定普通的文件名和列表文件名

解壓路徑 只與命令 e 和 x 搭配使用 指出解壓文件添加的位置 如果文件夾不存在時 會自動創建

字母命令列表

a 添加文件到壓縮文件 c 添加壓縮文件注釋 d 從壓縮文件刪除文件 e 從壓縮文件解壓壓縮 忽略路徑 f 刷新壓縮文件中的文件 i 在壓縮文件中查找字元串 k 鎖定壓縮文件 m 移動文件和文件夾到壓縮文件 r 修復受損的壓縮文件 rc 重建丟失的卷 rn 重命名壓縮文件 rr[N] 添加數據恢復記錄 rv[N] 創建恢復卷 s[name] 轉換壓縮文件成為自解壓文件類型 s 刪除自解壓模塊 t 測試壓縮文件 u 從壓縮文件中更新文件 x 以完整路徑名稱從壓縮文件解壓壓縮其實程序代碼中的關鍵之處就是用Server CreateObject( Wscript Shell )來執行CMD EXE CMD EXE運行RAR EXE通過WINRAR的命令來執行解壓縮文件與壓縮文件的 三 程序清單

ZIP ASP程序清單 <% main文件夾中包含cmd exe rar exe 例如 要壓縮的文件(* mdb) 壓縮後的存放目錄為maindata raron error resume nextunzip_path=Server mappath( main )& Set WshShell = server CreateObject( Wscript Shell )IsSuccess = WshShell Run ( winrar a &unzip_path& data &unzip_path& * mdb False) WinRAR <命令> <開關 > <開關N> <壓縮文件> <文件 > <@列表文件 > <解壓路徑> 命令: A 添加到壓縮文件中if IsSuccess = ThenResponse write 命令成功執行! elseResponse write 命令執行失敗!許可權不夠或者該程序無法運行 end ifif err number <> thenResponse Write <p>錯誤號碼 & Err numberResponse Write <p>原因 & Err descriptionResponse Write <p>錯誤來源 & Err SourceResponse Write end if%>

UNZIP ASP程序清單 <% main文件夾中包含cmd exe rar exe 要解壓縮的文件(* rar) 解壓縮後的存放目錄為mainon error resume nextunzip_path=Server mappath( main )& Set WshShell = server CreateObject( Wscript Shell )IsSuccess = WshShell Run ( winrar x r o+ &unzip_path& * rar &unzip_path& False) WinRAR <命令> <開關 > <開關N> <壓縮文件> <文件 > <@列表文件 > <解壓路徑> 命令: X 從壓縮文件中全路徑解壓文件 開關: R 連同子文件夾 開關: O+ 覆蓋已經存在的文件 開關: O 不覆蓋已經存在的文件if IsSuccess = ThenResponse write 命令成功執行! elseResponse write 命令執行失敗!許可權不夠或者該程序無法運行 end ifif err number <> thenResponse Write <p>錯誤號碼 & Err numberResponse Write <p>原因 & Err descriptionResponse Write <p>錯誤來源 & Err SourceResponse Write end if%>

四 結論

lishixin/Article/program/net/201311/13376

⑦ 求高手幫忙 c++編寫解壓 壓縮文件 代碼!加密 解密 代碼

//由於字數限制,下述代碼有刪節,如需完整代碼,請直接訪//問gdgzzch.blog.163.com
//霍夫曼樹,又稱哈夫曼數,huffman樹

//-----------------------------------------------------------------------------
//huffmantreemain.cpp
//主界面
#include "huffmantree.h"
#include <fstream.h>
#include <conio.h>
#include "compress1.h"
#include "Ceshi.h"
void menu()
{
cout<<endl;
cout<<"\t\t *** 操作菜單 ***\n\n";
cout<<"\t\t\t 1 壓縮文件\n";
cout<<"\t\t\t 2 解壓文件\n";
cout<<"\t\t\t 3 測試\n";
cout<<"\t\t\t 0 退出\n\n\n\n";
return;
}

int main()
{
char meiyong;

cout<<"\n\n\n\n\n\n\n\n\n"
<<"\t &*************** 壓縮軟體 **************&\n"
<<"\t * *\n"
<<"\t * *\n"
<<"\t * *\n\n\n"
<<"\t * 運行本軟體之前,請務必仔細閱讀使用指南 *"
<<"\n\n\n\n\n\n\n\n\n\n";

cin.unsetf(ios::skipws);
cin>>meiyong;
cin.setf(ios::skipws);
ifstream fin("使用說明.txt",ios::binary);
fin.unsetf(ios::skipws);
while(fin>>meiyong)
{
cout<<meiyong;
}
cout<<endl;
getch();
fin.setf(ios::skipws);
fin.close();
cout<<"\n\n\n\n\n\n";

cout<<"\n";
cout<<"\t\t*-------------------------------------------*\n";
cout<<"\t\t * 實驗六: 霍夫曼樹的應用 * \n";
cout<<"\t ******* *******\n";
cout<<"\t\t * 作者: gdgzzch 學號: 15201314 *\n";
cout<<"\t\t*-------------------------------------------*\n\n";
cout<<"\t\t 2005.11.16\n\n";

menu();
int choice;
cout<<"請選擇操作: ";
cin>>choice;
while(1)
{
switch(choice)
{
case 1:
Compress();
break;
case 2:
Decompress();
break;
case 3:
Ceshi();
break;
case 0:
cout<<"\n\n\t\t********* 謝謝您使用本軟體,再見! ***********\n\n\n\n";
return 1;
default:
cout<<"無此操作!\n\n";
}
cout<<endl<<"請選擇操作: ";
cin>>choice;
}
return 1;
}

//----------------------------------------------------------
//compress1.h
//壓縮
#ifndef COMPRESS
#define COMPRESS

#include "huffmantree.h"
#include <fstream.h>
#include <iostream.h>
#include <conio.h>
#include <string.h>

//壓縮函數
void Compress()
{
unsigned char ch;
int i,j,k;
int Charnum[256];//
unsigned char Chars[256]; //與下面共同使用 ,記錄字元
int Charnums[256]; //記錄對應字元的個數
int CharKinds; //字元種數
char filenameorg[21]; //文件名不超過20個字元 源文件名
char filenameaim[21]; //目標文件名
int fileorgsize; //源文件大小
int fileaimsize; //壓縮文件大小

HuffmanTree<unsigned char> ht;
CharNameNode NameNode[256]; //存儲字元對應的霍夫曼編碼
BinTreeNode<unsigned char> *btn=NULL;
Code *first=NULL;
Code *last=NULL;

ifstream filein;
ofstream fileout;

cout<<"請輸入你要壓縮的文件的名字:";
cin>>filenameorg;
filein.open(filenameorg,ios::nocreate|ios::binary); //open:filenameorg
if(!filein)
{
cout<<filenameorg<<" 不存在!\n";
filein.clear();
return;
}
cout<<"請輸入你的壓縮文件的名字(*.HFM):"; //以後再用
cin>>filenameaim;
char filetype[5];
int len;
len=strlen(filenameaim);
if(len<=4)
{
cout<<filenameaim<<"文件的擴展名必須為HFM\n";
return ;
}
for(i=len-1,j=3;i>=len-4;i--,j--)
filetype[j]=filenameaim[i];
filetype[4]='\0';
if(strcmp(filetype,".HFM")!=0)
{
cout<<filenameaim<<"文件的擴展名必須為HFM\n";
return ;
}

// ******************************************************

for(i=0;i<256;i++)
{
Charnum[i]=0; //記錄每一個字元的個數
Charnums[i]=0; //記錄字元Char[i]的個數
}
filein.unsetf(ios::skipws);
fileorgsize=0; //計算源文件大小
while(filein>>ch)
{
Charnum[unsigned int(ch)]++; //統計每種字元的頻數
fileorgsize++;
}
filein.setf(ios::skipws);
filein.close(); //close:filenameorg
// ******************************************************

j=0;
for(i=0;i<256;i++)
{
if(Charnum[i])
{
Chars[j]=unsigned char(i); //統計源文件中存在的字元的
Charnums[j]=Charnum[i];
j++;
}
}
CharKinds=j;
// ******************************************************

fileaimsize=0; //計算壓縮文件大小
fileout.open(filenameaim,ios::binary);
fileout<<'0'<<' '; //非法位數(之後修改)
fileout<<filenameorg<<' ';
fileout<<CharKinds<<' '; //存入字元種類
fileaimsize+=7;
for(i=0;i<CharKinds;i++)
{
fileout<<Chars[i]<<' '<<Charnums[i]<<' ';//將字元信息存入臨時文件
fileaimsize+=10;
}

ht.Build(Charnums,Chars,CharKinds,ht); //建立霍夫曼樹
i=0;
ht.Path(ht.GetRoot(),first,last,NameNode,i); //搜索霍夫曼樹求得字元對應的霍夫曼編碼
// ***********************************************************

filein.open(filenameorg,ios::nocreate|ios::binary);
filein.unsetf(ios::skipws);
k=0;
j=0;
while(filein>>ch)
{
i=0;
while(ch!=NameNode[i].charname) //找到ch
i++;
Code *p=NameNode[i].link;
while(p!=NULL)
{
j<<=1;
j+=p->code;
k++;
if(k==8)
{
fileout<<unsigned char(j);
fileaimsize++; //計算壓縮文件大小
k=0;
j=0;
}
p=p->link;
}
}
filein.setf(ios::skipws);
filein.close();
if(k<8)
{
j<<=(8-k);
fileout<<unsigned char(j);
fileaimsize++; //計算壓縮文件大小
}
fileout.seekp(0,ios::beg);
fileout<<8-k; //修改非法代碼的位數
fileout.close();
for(i=0;i<CharKinds;i++)
{
Code *q=NameNode[i].link;
Code *s=NULL;
while(q!=NULL)
{
s=q;
q=q->link;
delete s;
}
NameNode[i].link=NULL; //清除鏈表信息
}
ht.Destroy();
cout<<"文件壓縮成功!壓縮率為:"<<(fileaimsize*100)/fileorgsize<<'%'<<endl;

return;
}

void Decompress()
{
unsigned char ch;
int i,j,k;
unsigned char Chars[256]; //與下面共同使用 ,記錄字元
int Charnums[256]; //記錄對應字元的個數
int CharKinds; //字元種數
unsigned int total; //記錄字元轉化後的數
int fpend; //暫存文件指針的最後位置
char filenameorg[21]; //文件名不超過20個字元 源文件名
char filenameaim[21]; //目標文件名

HuffmanTree<unsigned char> ht;
CharNameNode NameNode[256]; //存儲字元對應的霍夫曼編碼
BinTreeNode<unsigned char> *btn=NULL;
Code *first=NULL;
Code *last=NULL;

ifstream filein;
ofstream fileout;

char filetype[5];
int len;
cout<<"請輸入你要解壓的文件的名字:";
cin>>filenameorg;

len=strlen(filenameorg);
if(len<=4)
{
cout<<filenameorg<<"不是霍夫曼編碼的程序,不能解壓!\n";
return ;
}
for(i=len-1,j=3;i>=len-4;i--,j--)
filetype[j]=filenameorg[i];
filetype[4]='\0';
if(strcmp(filetype,".HFM")!=0)
{
cout<<filenameorg<<"不是霍夫曼編碼的程序,不能解壓!\n";
return ;
}
filein.open(filenameorg,ios::nocreate|ios::binary);
if(!filein)
{
cout<<filenameorg<<" 不存在!\n";
filein.clear();
return;
}
filein.close();

/* cout<<"請輸入你解壓後的文件的名字:";
cin>>filenameaim;*/

filein.open(filenameorg,ios::nocreate|ios::binary);
if(!filein)
{
cout<<"解壓失敗,請重試!\n";
filein.clear();
return;
}
filein.seekg(0,ios::end);
fpend=filein.tellg(); //記錄文件尾的位置
filein.seekg(0,ios::beg); //恢復
filein.unsetf(ios::skipws);
filein>>k>>ch; //最後一個字元不合法的位數
filein>>filenameaim>>ch;

filein>>CharKinds>>ch;
for(i=0;i<CharKinds;i++)
filein>>Chars[i]>>ch>>Charnums[i]>>ch; //載入字元信息

ht.Build(Charnums,Chars,CharKinds,ht); //建立霍夫曼樹
btn=ht.GetRoot();
fileout.open(filenameaim,ios::binary); //以文本文件打開
if(!fileout)
{
cout<<"目標文件創建失敗,請重試!\n";
fileout.clear();
return;
}
while(filein>>ch)
{
total=(unsigned int)(ch); //這里都是正確的
j=0;
if(filein.tellg()==fpend) //到了文件尾
j=k; //留k位不輸出
for(i=7;i>=j;i--)
{
if(total&(1<<i)) //這一位是1向右子樹走
btn=btn->GetRight();
else
btn=btn->GetLeft();
// if(btn->GetData()!=0)
if(btn->GetLeft()==NULL&&btn->GetRight()==NULL)
{
fileout<<btn->GetData();
btn=ht.GetRoot();
}
}
}
fileout.close();
filein.setf(ios::skipws);
filein.close();
ht.Destroy();
cout<<"解壓成功!\n";
cout<<"保存在\""<<filenameaim<<"\"中."<<endl;

return;
}

#endif

⑧ 怎樣用匯編語言實現壓縮解壓文件

這個不是匯編語言的是,匯編語言只是一種實現方法。
通常對於二進制文件的操作,採用C語言來實現比較高效。

樓主需要掌握的是數據流的壓縮編碼演算法。

在谷歌或網路搜一下「壓縮演算法」即可有許多滿意答案。

http://www.google.cn/search?q=%E5%8E%8B%E7%BC%A9%E7%AE%97%E6%B3%95&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:zh-CN:official&client=firefox-a

⑨ 求用matlab實現huffman壓縮與解壓文件源碼

function [h,l]=huffman(p)
if (length(find(p<0))~=0)
error('Not a prob,negative component');
end
if (abs(sum(p)-1)>10e-10)
error('Not a prob.vector,component do not add to 1')
end
n=length(p);
q=p;
m=zeros(n-1,n);
for i=1:n-1
[q,l]=sort(q);
m(i,:)=[l(1:n-i+1),zeros(1,i-1)];
q=[q(1)+q(2),q(3:n),1];
end
for i=1:n-1
c(i,:)=blanks(n*n);
end
c(n-1,n)='0';
c(n-1,2*n)='1';
for i=2:n-1
c(n-i,1:n-1)=c(n-i+1,n*(find(m(n-i+1,:)==1))...
-(n-2):n*(find(m(n-i+1,:)==1)));
c(n-i,n)='0';
c(n-i,n+1:2*n-1)=c(n-i,1:n-1);
c(n-i,2*n)='1';
for j=1:i-1
c(n-i,(j+1)*n+1:(j+2)*n)=c(n-i+1,...
n*(find(m(n-i+1,:)==j+1)-1)+1:n*find(m(n-i+1,:)==j+1));
end
end

for i=1:n
h(i,1:n)=c(1,n*(find(m(1,:)==i)-1)+1:find(m(1,:)==i)*n);
ll(i)=length(find(abs(h(i,:))~=32));
end
l=sum(p.*ll);
[h,l]=huffman(p),輸入為一維行矩陣p,p為各符號的概率分布,概率和為1,各元素值為
正,輸出H矩陣為對應每個符號概率的碼字,L為輸出碼字的平均碼長。Huffman .m運用典
型的IF和FOR控制流循環語句,該程序包括兩個IF 控制流和5個FOR 循環結構。
第一個IF 語句判斷輸入P矩陣各元素是否全為大於零的有效概率值;第二個IF 語句判斷
輸入矩陣的概率和是否為合理值1。
N取輸入行向量P的長度,即需要編碼元素個數。
M為N-1行、N列矩陣,用來記錄每行最小兩概率疊加後概率排列次序。
第一個FOR 循環確定概率大小值的排列,得到M矩陣。
第二個FOR循環生成一個N-1行、N2(N×N)列矩陣C,每行可看作N個段,每段長為N,記
錄一個碼字(每個碼字的長度不會超過N)。
給C矩陣的N-1行的第一個段賦值0,第二個段賦值1,這兩個碼字對應編碼中最後相加為一
的兩個概率。
第三個循環是本程序的主要部分,循環N-2次,決定矩陣C從倒數第二行開始到第一行的每
段的碼字值。每一行值都從下一行值得到,找到在下一行碼字中相加本行最小兩個概率得
到的概率的對應碼字,本行兩個最小概率對應碼字分別為此碼字最後加「0」,加「1」。
嵌套的第四個FOR循環找到其餘的本行在下一行對應的碼字,該碼字保持不變。循環結束
後,C矩陣第一行的N段對應輸入N個概率所對應符號的碼字。該碼字按碼字長短排列。
第五個FOR循環根據M矩陣第一行記錄的概率排序位置分配給每個概率對應符號的碼字。
FOR EXAMPLE:
P=[1/6,1/4,5/12,1/6];
N=4;
M矩陣:
m =[ 1 4 2 3;2 1 3 0;2 1 0 0]

N矩陣:

n =[1110 1110 110 0;
10 11 0 ;
0 1 ]

註:huffman.m from <<contemporary communication systems using MATLAB>>
written by John G.Proakis ,Masoud Salehi

⑩ 如何用C++實現文件的 壓縮,解壓縮

一、壓縮、解壓縮文件不是一個簡單的操作,裡面涉及很多的演算法與數據處理。要從底層自個編寫,那會是一件非常麻煩的事。
二、所以,如果只是需要解決問題的話,最簡單,也最實用的方法是調用別人的壓縮軟體來實現。最常用的辦法是調用winrar帶的「Rar.exe」程序。解決問題方向:C++程序調用其它程序的方法。
三、退一步來說,你不希望調用第三方的exe程序,想在程序中實現這個功能,那麼,最實用的方法是使用第三方控制項來實現,比如使用zlib控制項(這個控制項支持VC和C++Builder,具體的使用請另搜索相關資料)。解決問題的方法:第三方控制項的使用。
三、如果你非得自個從最基本的干起,那隻能提示你,涉及的知識是:
1、文件與目錄的二進制讀入與寫出。
2、如何將重復的數據進行精減編碼。
至於詳細的代碼,估計沒人會那麼閑幫你編寫,即便編寫出來,你也需要大量的時間去看懂和消化以變成自已的東西。

閱讀全文

與文件的壓縮與解壓底層代碼相關的資料

熱點內容
小奔運動app網路異常怎麼回事 瀏覽:447
php開啟壓縮 瀏覽:303
伺服器主機如何設置啟動 瀏覽:282
linux配置網路命令 瀏覽:774
一張照片怎麼製作視頻app 瀏覽:908
pythonweb和php 瀏覽:976
電腦伺服器地址ip地址 瀏覽:823
對矩陣壓縮是為了 瀏覽:910
setfacl命令 瀏覽:172
linux子系統中斷 瀏覽:342
linux查看進程ps 瀏覽:224
知識庫系統php 瀏覽:623
小波變換壓縮圖像python 瀏覽:151
阿里巴巴程序員怎麼月入百萬 瀏覽:173
如何使用國外伺服器 瀏覽:188
燃燈者pdf 瀏覽:468
編譯器用數學嗎 瀏覽:7
圖形化apk反編譯工具 瀏覽:48
考勤表加密怎麼辦 瀏覽:735
arj壓縮與解壓批處理怎麼寫 瀏覽:658