❶ 把純文本字元串用Gzip壓縮再轉換為Base64能有多少壓縮率
其實具體多大壓縮率要看源文件的內容,一般來說重復的單詞越多,壓縮率越高。
下面是把/usr/share/dict/words壓縮的測試程序
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;
import org.apache.commons.codec.binary.Base64;
public class GzipBase64Tests {
public static void main(String[] args) throws Exception {
File input = new File("/Users/matianyi/input.txt");
File output = new File("/Users/matianyi/output.txt");
if (!input.exists()) {
System.out.println("input file not exists!");
return;
}
if (output.exists()) {
output.delete();
}
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
GZIPOutputStream gout = new GZIPOutputStream(buffer);
FileInputStream in = new FileInputStream(input);
long t1 = System.currentTimeMillis();
byte[] buf = new byte[1024];
int total=0;
int rd;
while ((rd = in.read(buf)) != -1) {
total += rd;
gout.write(buf,0, rd);
}
gout.close();
in.close();
byte[] result = buffer.toByteArray();
long t2 = System.currentTimeMillis();
String base64 = Base64.encodeBase64String(result);
long t3 = System.currentTimeMillis();
System.out.printf("raw %d -> gzip %d -> base64 %d, time1 %dms, time2 %dms", total, result.length, base64.length(), t2-t1, t3-t2);
}
}
輸出為: raw 2493109 -> gzip 753932 -> base64 1005244, time1 225ms, time2 43ms
壓縮了50%。
❷ C#string類型壓縮,最低能壓縮多少
string能夠壓縮多少,要看具體它攜帶的信息。
比如string s = new string('x', 10000000)一千萬個字元,由於信息量少,可以壓縮為幾個位元組。
而一個信息量大的串,比如100個隨即字元的串,可能都壓縮不了。
從信息理論上說,一定有東西是壓縮不了的。
抽屜原理告訴我們,3個蘋果放入2個抽屜,一定有抽屜要放一個以上的蘋果。
100個位元組,所有的組合有2的800次方那麼多。
而101個位元組的組合,有2的808次方那麼多,這些組合是不能放入100個位元組的抽屜而不重復的。
也就是說,某些數據是不能被壓縮的,哪怕是只壓縮一個位元組也辦不到。
❸ 急求lempel-ziv壓縮演算法c語言
Lempel-Ziv壓縮演算法之原理
在LZ壓縮演算法的背後是使用RLE演算法用先前出現的相同位元組序列的引用來替代。
簡單的講,LZ演算法被認為是字元串匹配的演算法。例如:在一段文本中某字元串經常出現,並且可以通過前面文本中出現的字元串指針來表示。當然這個想法的前提是指針應該比字元串本身要短。
例如,在上一段短語「字元串」經常出現,可以將除第一個字元串之外的所有用第一個字元串引用來表示從而節省一些空間。
一個字元串引用通過下面的方式來表示:
1.唯一的標記
2.偏移數量
3.字元串長度
由編碼的模式決定引用是一個固定的或變動的長度。後面的情況經常是首選,因為它允許編碼器用引用的大小來交換字元串的大小(例如,如果字元串相當長,增加引用的長度可能是值得的)。
Lempel-Ziv壓縮演算法之實現
使用LZ77的一個問題是由於演算法需要字元串匹配,對於每個輸入流的單個位元組,每個流中此位元組前面的哪個位元組都必須被作為字元串的開始從而盡可能的進行字元串匹配,這意味著演算法非常慢。
另一個問題是為了最優化壓縮而調整字元串引用的表示形式並不容易。例如,必須決定是否所有的引用和非壓縮位元組應該在壓縮流中的位元組邊界發生。
基本壓縮庫使用一個清晰的實現來保證所有的符號和引用是位元組對齊的,因此犧牲了壓縮比率,並且字元串匹配程序並不是最優化的(沒有緩存、歷史緩沖區或提高速度的小技巧),這意味著程序非常慢。
另一方面,解壓縮程序非常簡單。
一個提高LZ77速度的試驗已經進行了,這個試驗中使用數組索引來加速字元串匹配的過程。然而,它還是比通常的壓縮程序慢。
❹ 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);
}