c语言压缩数据
C语言经典的无损压缩算法有:哈夫曼算法、LZ。
哈夫曼算法:
哈夫曼编码是David A. Huffman于1952年发明的一种满足对编码算法要求的一种编码算法。
哈夫曼算法是利用频率信息构造一棵二叉树,频率高的离根节点近(编码长度短),频率低的离根节点远(编码长度长),手动构造方法是先将字母按照频率从小到大排序,然后不断选择当前还没有父节点的节点中权值最小的两个,构造新的父节点,父节点的值为这两个节点值的和,直到构造成一棵二叉树。
LZ算法:
LZ算法及其衍生变形算法是压缩算法的一个系列。LZ77和LZ78算法分别在1977年和1978年被创造出来。虽然他们名字差不多,但是算法方法完全不同。这一系列算法主要适用于字母数量有限的信息,比如文字、源码等。流行的GIF和PNG格式的图像,使用颜色数量有限的颜色空间,其压缩就采用了两种算法的灵活变形应用。
你是想自己写代码实现解压缩的功能,还是只是在代码中调用命令来解压,system()找到你的解压缩工具在加相应的参数
‘叁’ C语言实现文件压缩
typedef int (WINAPI ICEPUB_COMPRESSFILE)(char *strFilename, char *strZipFilename);
ICEPUB_COMPRESSFILE *icePub_compressFile = 0;
HINSTANCE hDLLDrv = LoadLibrary("icePubDll.dll");
if(hDLLDrv)
{
icePub_compressFile = (ICEPUB_COMPRESSFILE *)GetProcAddress(hDLLDrv, "icePub_compressFile");
}
if(icePub_compressFile)
icePub_compressFile("a.exe","a.Z");
if(hDLLDrv)
FreeLibrary(hDLLDrv);
typedef int (WINAPI ICEPUB_UNCOMPRESSFILE)(char *strZipFilename,char *strFilename);
ICEPUB_UNCOMPRESSFILE *icePub_uncompressFile = 0;
HINSTANCE hDLLDrv = LoadLibrary("icePubDll.dll");
if(hDLLDrv)
{
icePub_uncompressFile = (ICEPUB_UNCOMPRESSFILE *)GetProcAddress(hDLLDrv, "icePub_uncompressFile");
}
if(icePub_uncompressFile)
icePub_uncompressFile("a.Z","a.exe");
if(hDLLDrv)
FreeLibrary(hDLLDrv);
‘肆’ C语言压缩
#include<stdio.h>
intmain()
{inti,j;
chars[105];
scanf("%s",s);
for(j=0,i=1;s[i];i++)
{while(s[i]==s[i-1])i++;
printf("%d",i-j);
j=i;
}
printf("%d
",i-j);
return0;
}
‘伍’ 用c语言编译个简单压缩程序
/*
流程是:
1.读取一个字符,写入A
2.再读取一个字符,写入B
3.判断AB是否相等,相等转4,否则转5
4.一直读,同时统计数量,直到读取到和A不相等的字符,将改字符写入B,转5
5.将对应数据写入文件
下面是伪代码
*/
charA;
charB;
inti;
FilewriteFile;//要写入的文件
FilereadFile;//要读的文件
A=readChar(readFile);//读一个字符
while(文件未读完){
B=readChar(readFile);//读一个字符
if(A==B){
i=2;
while((B=readChar(readFile))==A){//一直读,直到读取的字符和A不一样
i++;
}
write(writeFile,A+"$"+i);//i代表重复数量
A=B;
}else{
write(writeFile,A);
A=B;
}
}
‘陆’ c语言字符串如何压缩
话说B数组不应该是整形呀,不然不能保存字母了。以下是我的代码。。。
#include<iostream>
#include<string.h>
#include<stdio.h>
usingnamespacestd;
voidyasuo(chara[],charb[])
{
intcount=1,p=0;
for(inti=0;i<strlen(a);i++)
if(a[i]==a[i+1])
count++;
elseif(count>2)
{
b[p++]=(char)(count+'0');
b[p++]=a[i];
count=1;
}
elseif(count==2)
{
b[p++]=a[i];
b[p++]=a[i];
count=1;
}
else
b[p++]=a[i];
}
voidprintB(charb[])
{
cout<<b<<endl;
}
voidbackB(charb[])
{
for(inti=0;i<strlen(b);i++)
if(b[i]<='9'&&b[i]>='3')
{
for(intj=0;j<(int)(b[i]-'0');j++)
cout<<b[i+1];
i++;
}
else
cout<<b[i];
cout<<endl;
}
intmain()
{
chara[1000]={0},b[1000]={0};
gets(a);
yasuo(a,b);
printB(b);
backB(b);
}
‘柒’ c语言 文本文件压缩
再发次,有80分呢哎
‘捌’ 用C语言编程:一个简单的数据压缩程序(急!!!)
#include"stdio.h"
int c1(char a[],int i)
{int c=1;
while(a[i+1]==a[i])
{c++;i++;}
return c;
}
int c2(char a[],int i)
{int c=0;
while(a[i+1]!=a[i])
{c++;i++;}
return c;
}
int len(char a[])
{ int i=0;
while(a[i]!='\0')
i++;
return i;
}
main()
{char b[100];
char a[100]={'5','5','5','8','1','3','胡此9','9','9','9','7','2','7','2','6','6','6'};
int i=0,j=0,k=0,s,c;
while(a[i]!='裤链迅\0')
{
if(a[i+1]==a[i])
{
c=c1(a,i);
b[j]=c;
b[j+1]=a[i];
i++;j++;
}
else
{ c=c2(a,i);
b[j]=-c;
for(k=0;k<c;k++)
{b[j+1]=a[i];
i++;j++;}
}
i+=c;
}
s=len(b);
for(j=0;j<s;j++)
printf("%d",b[j]);
}
帮我唤毕看一下,哪里错了,谢谢
‘玖’ 如何用C语言实现数据压缩
首先选择一个压缩算法
然后按照算法实现压缩代码,调用接口就可以
常见的 可以使用哈夫曼编码压缩,或者使用开源的压缩代码,比如lzo, gzip, lzma等等。