导航:首页 > 文件处理 > 文件的压缩与解压底层代码

文件的压缩与解压底层代码

发布时间: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、如何将重复的数据进行精减编码。
至于详细的代码,估计没人会那么闲帮你编写,即便编写出来,你也需要大量的时间去看懂和消化以变成自已的东西。

阅读全文

与文件的压缩与解压底层代码相关的资料

热点内容
未来最值得投资的加密货币 浏览:524
ascii码是编译的时候用吗 浏览:779
压缩机感应包可以通用吗 浏览:410
方舟服务器怎么发布到搜索列表 浏览:270
xml防反编译 浏览:239
数据传输加密系统技术方案 浏览:842
程序员没有准备去面试 浏览:4
51单片机usb鼠标 浏览:879
qq服务器的ip地址查询 浏览:112
java仿qq聊天 浏览:400
解压的ipa重新打包 浏览:142
程序员那么可爱vip版 浏览:239
程序员怎么升职 浏览:243
图形化命令按钮vb 浏览:987
vcu盘加密怎么设置 浏览:414
如何加密备份微信聊天记录 浏览:529
安卓手机如何模拟键盘 浏览:932
查看dns地址命令 浏览:768
android录屏工具 浏览:841
成都互动直播系统源码 浏览:955