数据压缩及解压缩算法,多种文件的压缩与解压缩-java android

> 数据压缩算法,文本压缩算法
几种压缩算法原理介绍- https://blog.csdn.net/clevercode/article/details/46691645
文本压缩算法的对比和选择- https://blog.csdn.net/horkychen/article/details/75174035
数据压缩的历史、原理及常用算法- https://blog.csdn.net/sinat_37138973/article/details/72675574
文本压缩算法的对比和选择- https://blog.csdn.net/HorkyChen/article/details/75174035
Lossy text compression with NLP文本压缩- https://github.com/HorkyChen/LossyTextCompression
  在数据压缩领域里,文本压缩的历史最久,从Morse到Huffman和算术编码(Arithmetic coding),再到基于字典和上下文的压缩算法。各种算法不断改进,从通用算法,到现在更具针对性的算法,结合应用场景的垂直化的趋势越来越明显。所以在选择或者评价压缩算法,一定要结合实际应用场景加以考虑,包括字符集、内容的大小、压缩及解压的性能、以及各端支持情况。
  最典型的建模方法是基于字符的概率统计,而基于上下文的建模方法(Context Modeling)则是从文本内容出发,它们追求的目标都是让字符的出现概率越不平均越好。转换方法是最具代表性的是基于词典的转换,比如庞大的LZ族系。Huffman和算术编码则是常见的编码方法。

-- 常用的数据压缩算法有:游程编码;lz77;lz78;lzma;哈夫曼编码;ppm;算术编码;bwt变换
1.有损压缩:JPEG联合图像专家组;MPEG视频专家组;MP3第三代音频协议(图像,视频,音频);
2.无损压缩:游程长度编码;哈夫曼编码;lempel ziv编码;

-- 基本的分为两大类:有损和无损:
 1.有损压缩:主要是一些量化算法,比如a率,u率,lloyds最优量化。有损压缩方案在图像,音频,视频,或者其他为了提高压缩效率而可以接受某些程度信息丢失的场合很有用处。
 2.无损压缩:主要是一些编码算法,比如子带编码,差分编码,哈夫曼编码等。无损压缩方案通常被用来压缩文本,可执行程序,或者其他任何需要完全重建数据的地方。

-- 数据压缩分为有损压缩和无损压缩,其中有损压缩方法有两种:          
  1.一种是行程编码,即将原数据中连续出现的信源符号(行程)用一个计数值(行程长度)和该信源符号来代替。举个例子,数据段aaaaabbbbbccccdddd,经行程编码压缩后的结果为5a5b4c4d,压缩比约为2:1。        
  2.另一种是哈夫曼编码,根据信源符号出现的比率的分布特征而进行压缩编码,在信源符号和编码之间建立明确的一一对应的关系。哈夫曼编码采用变长二进制编码,将出现比率高的信源符号用较短的编码,而出现比率低的用较长编码,从而实现数据压缩。

-- 当前比较流行的压缩算法中其突破的核心只有两个: 
* ANS (FSE是它的一个实现): Facebook zStd, Apple的lzfse等 
* Context Modeling + LZ77 (编码是Huffman): Brotli

  ANS是前两类编码算法战争的终结者。它在2014年被提出来,随后很快就得到了大量应用。本质上属于算术编码,但它成功地找到了一个用近似概率表示的表格,将原来的概率计算转换为查表。所以它是一个达到Huffman编码效率的算术编码方法。FSE(Finite State Entropy)是ANS最为著名的实现。
  可行的算法只需要基于一部分内容的上下文进行预测,这就是PPM(部分匹配预测,prediction by partial match)以及各种演进版本。

> 数据压缩及解压缩
-- LZ77压缩和解压,无损压缩算法
lz77压缩算法与哈夫曼压缩算法,LZ77算法如何做压缩及解压缩。
LZ77压缩和解压算法(C版)- https://blog.csdn.net/qq_23084801/article/details/77496955
A Python LZ77-Compressor- https://github.com/manassra/LZ77-Compressor/

1、LZ77是基于字典的算法,和霍夫曼编码不同,其处理的符号不一定是文本字符,可以是任何大小的符号。 
2、LZ77使用前向缓冲区(待编码区的小段)和一个滑动窗口(搜索区)实现。滑动窗口是个历史缓冲器,它被用来存放输入流的前n个字节的有关信息。前向缓冲区是与动态窗口相对应的,它被用来存放输入流的前n个字节。常用滑动窗口4KB,前向缓冲区32B 
   LZ77算法主要思想就是在前向缓冲区中不断寻找能够与字典中短语匹配的最长短语。如果匹 配的数据长度大于最小匹配长度,那么就输出一对〈长度,距离滑动窗中对应的位置〉数组。长度(length)是匹配的数据长度,而距离(distance)说明了在输入流中向后多少字节这个匹配数据可以被找到。 
 LZ77算法中代价最高的是滑动窗口中扫描匹配短语。一个更高效的方法是用某种高效搜索性能的数据结构代替滑动窗口。 
 LZ77比霍夫曼编码有更好的压缩比,但是压缩过程中LZ77要消耗相当长的时间。

LZ77算法原理及实现- http://www.cnblogs.com/en-heng/p/4992916.html
LZ78算法原理及实现- http://www.cnblogs.com/en-heng/p/6283282.html

-- LZ77,LZSS
 LZ77算法是采用字典做数据压缩的算法,由以色列的两位大神Jacob Ziv与Abraham Lempel在1977年发表的论文《A Universal Algorithm for Sequential Data Compression》中提出。此算法的一个改进算法是由Storer和Szymanski在1982年开发的,称为LZSS算法。LZ77是典型的基于字典的压缩算法,现在很多压缩技术都是基于LZ77。鉴于其在数据压缩领域的地位。LZ77算法是无损压缩算法。

-- LZ78,LZW
  A.Lempel和J.Ziv在1978年首次发表了介绍这种编码方法的文章,称为LZ78。在他们的研究基础上,Terry A.Welch在1984年发表对这种编码算法进行了改进的文章,并首先在高速硬盘控制器上应用了这种算法。因此后来把这种编码方法称为LZW(Lempel-Ziv Walch)压缩编码。LZSS同样可以和熵编码联合使用,例如ARJ就与霍夫曼编码联用,而PKZip则与Shannon-Fano联用,它的后续版本也采用霍夫曼编码。

-- Huffman与LZ77
  Huffman:基于统计的数据压缩编码,比如Huffman编码,需要得到先验知识——信源的字符频率,然后进行压缩。但是在大多数情况下,这种先验知识是很难预先获得。因此,设计一种更为通用的数据压缩编码显得尤为重要。
  LZ77数据压缩算法应运而生,其核心思想:利用数据的重复结构信息来进行数据压缩

-- gzip和zlib
zlib识别算法把字节码[0...255]分成三大类:
 (1)白名单:文本型字节码,包括9(TAB), 10(LF), 13(CR), 32(SPACE)到255。
 (2)灰名单:可容忍的字节码,包括7(BEL), 8(BS), 11(VT), 12(FF), 26(SUB), 27(ESC)。
 (3)黑名单:不能容忍的、非文本型字节码,包括0(NUL)到6, 14到31。
通用编码技术。词典编码(Dictionary Encoding)技术就是属于这一类,这种技术属于无损压缩技术。

deflate(RFC1951):一种压缩算法,使用LZ77和哈弗曼进行编码;
zlib(RFC1950):一种格式,是对deflate进行了简单的封装,他也是一个实现库(delphi中有zlib,zlibex)
gzip(RFC1952):一种格式,也是对deflate进行的封装。

gzip = gzip头 + deflate编码的实际内容 + gzip尾
zlib = zlib头 + deflate编码的实际内容 + zlib尾

zlib,gzip,zip,7z压缩的区别- https://blog.csdn.net/lanmenghcc/article/details/40071923
  zlib是一种数据压缩程序库,它的设计目标是处理单纯的数据(而不管数据的来源是什么)。zip是适用于压缩多个文件的格式(相应的工具有PkZip和WinZip等),因此,zip文件还要进一步包含文件目录结构的信息,比gzip的头信息更多。但需要注意,zip格式可采用多种压缩算法,我们常见的zip文件大多不是用zlib的算法压缩的,其压缩数据的格式与gzip大不一样。
  gzip是一种文件压缩工具(或该压缩工具产生的压缩文件格式),它的设计目标是处理单个的文件。gzip在压缩文件中的数据时使用的就是zlib。为了保存与文件属性有关的信息,gzip需要在压缩文件(*.gz)中保存更多的头信息内容,而zlib不用考虑这一点。但gzip只适用于单个文件,所以我们在UNIX/Linux上经常看到的压缩包后缀都是*.tar.gz或*.tgz,也就是先用tar把多个文件打包成单个文件,再用gzip压缩的结果。

  Java SDK提供了对上述三种压缩技术的支持:Inflater类和Deflater类直接用zlib库对数据压缩/解压缩,GZIPInputStream类和GZIPOutputStream类提供了对gzip格式的支持,ZipFile、ZipInputStream、ZipOutputStream则用于处理zip格式的文件。

> 多种文件的压缩与解压缩
Android多种格式的异步解压/压缩解决方案- http://www.jianshu.com/p/339ab9048f91#
zip4j是一个在java上比较好用的zip文件压缩解压库 http://www.softpedia.com/get/Programming/Components-Libraries/Zip4j.shtml
rar格式- http://www.java2s.com/Code/Jar/j/Downloadjavaunrar05jar.htm
7z格式- http://sevenzipjbind.sourceforge.net/
J7zip on Android- http://stackoverflow.com/questions/14024874/j7zip-on-android-extracting-from-an-archive-and-listing-contents/14676769#14676769
A simple android ndk library used to simply extract lzma 7z files- https://github.com/hzy3774/AndroidUn7zip
  还有一种7z的解压方法,就是利用compressor开源库解压,也可以在Android上运行,但是实际使用过程中还是有点问题的 https://github.com/nickming/ArchiverDemo
  Android Gzip压缩和解压缩文件- http://blog.csdn.net/mobei1983/article/details/51505581

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值