精华内容
下载资源
问答
  • 【步兵 工具篇】lzma算法压缩字节流 by EOS. 其实今天这篇博客,是一个中间产物,因为在研究热更新,然后就想自己写一套, 下载部分用了curl库,但是文件打包,感觉用zip感觉差点意思,就作死的去研究tar.xz

    【步兵 工具篇】lzma算法,压缩字节流 by EOS.

    本来上周就打算写的,不过孩子连续高烧,住院了一个礼拜。一个礼拜没回家,还写什么博客。
    虽然花了不少钱,好在孩子也恢复过来了,继续努力,挣钱养家(ps:医院真心贵。~)

    言归正传,其实今天这篇博客,是一个中间产物,因为在研究热更新,然后就想自己写一套,
    下载部分用了curl库,但是文件打包,感觉用zip感觉差点意思,就作死的去研究tar.xz这种格式。
    说实话几天过来,感觉到想搞点啥东西,不会英文真是费劲,只能靠悟的 = =、


    LZMA

    首先一开始研究的是 XZ Utils,在其主页上明显的放着LZMA SDK。
    然后 点进去,直接就跑到 7z 的官网了,后来才得知7z也用的是这种算法。。。。
    甚至还有对LZMA进行多线程和压缩时间优化的LZMA2算法,不过并没有提供独立lib,
    自己搞一通费劲的要死,所以直接选用了LZMA。

    其实我的需求并不是算法本身,而是它压缩数据的能力,所以具体算法我并没有过多的研究,
    有兴趣的话可以自行研究一下。 不过大致上是对重复序列的特殊处理,可结合下图体会一下。
    这里写图片描述
    这里写图片描述
    可以看到上图基本上将算法本身发挥到极致,5M的数据压缩到800字节左右。
    而下图明显无序,所以压缩效果就并没有那么明显了。

    lib只提供了,一个压缩函数和一个解压函数,十分难用,所以我进行了一下二次封装。
    一些压缩解压涉及到的数据都拼到字节流里了,所以看到了十分爽朗的接口~0~


    文件压缩

    其实我们经常会用到以rb/wb的形式进去文件操作,一是处理起来简单,二是也算一种简单的加密。
    fopen、fread、fwrite,当以二进制格式操作的时候,操作的就是字节流。
    所以不难想到,我们可以把文件先读进内存,然后再压缩字节流,然后再写会硬盘。
    这样就实现了对文件的压缩,反之则是文件的解压。

        cout << "\n\npart2:" << endl;
        Byte* buff = nullptr;
        size_t baseLen1 = 0;
        size_t baseLen2 = 0;
        size_t newlen = 0;
        FILE* fp1 = fopen("../src/EOS.tar", "rb");
        if (fp1)
        {
            fseek(fp1, 0, SEEK_END);
            size_t file_len = ftell(fp1);
            baseLen1 = file_len;
            buff = new Byte[file_len];
            fseek(fp1, 0, SEEK_SET);
            fread(buff, file_len, 1, fp1);
            fclose(fp1);
            newlen = LZER->code(buff, file_len);
            delete[] buff;
            buff = new Byte[newlen];
            LZER->copyCodeBuff(buff, newlen);
    
            FILE* fp2 = fopen("../src/EOS.tar.xz", "wb");
            if (fp2)
            {
                fwrite(buff, newlen, 1, fp2);
                fclose(fp2);
                delete[] buff;
            }
        }
    
    
        FILE* fp3 = fopen("../src/EOS.tar.xz", "rb");
        if (fp3)
        {
            fseek(fp3, 0, SEEK_END);
            size_t file_len = ftell(fp3);
            buff = new Byte[file_len];
            memset(buff, 0, file_len);
            fseek(fp3, 0, SEEK_SET);
            fread(buff, file_len, 1, fp3);
            fclose(fp3);
            Byte a = buff[file_len - 1];
            newlen = LZER->decode(buff, file_len);
            delete[] buff;
            buff = new Byte[newlen];
            LZER->copySrcBuff(buff, newlen);
            baseLen2 = newlen;
    
            FILE* fp4 = fopen("../src/EOS_2.tar", "wb");
            if (fp4)
            {
                fwrite(buff, newlen, 1, fp4);
                fclose(fp4);
                delete[] buff;
            }
        }

    这里写图片描述
    执行结果如图,不过因为把一些数据直接拼接到了字节流中,所以用winrar之类压缩软件是查看不了
    tar.xz后缀的这个文件的。如果使用xz命令进行打包的话,用winrar是可以直接双击查看的。

    不过不难看出这种算法,并没有涉及文件操作,所以要实现多文件或递归文件夹压缩,还要解决
    tar命令的压缩和解压等问题,研究问题,总会遇到坎坷的。。。

    不过可以试想一下,可以用此算法为基础做多文件的拼接的实现,因为都是字节流吗,当然可以用
    一个更大的容器把他们都塞进去,记录其起始位置,和文件大小,再对其进行拆解。

    比如:
    fileName%startPos%fileLen【分隔符】fileName%startPos%fileLen

    【FList】eos.lua%100%800!cpp/eos.cpp%901%400!...#FList】然后后边是文件字节流...最后再来点加密解密的信息

    不过中间又会遇到多少坑就不得而知了=、=


    工具奉上

    使用时,dll文件放到exe同级,然后调用文件 只要加上下面三句就可以了。

    #include "liblzma/LzmaLib.h"
    #include "liblzma/LzmaCoder.h"
    #pragma comment(lib,"LZMA.lib")

    有需求兄弟们,有福了,不用自己折腾了~

    > git clone git@github.com:Git-EOS/lzma.git

    本来想用云盘的,不值为何分享不出连接,各种404,无奈只好上git


    总结

    说了这是中间产物,再研究下7z的库。或者tar的解压。不过扛不住就只能换zip的库了。
    毕竟cocos有一套热更代码,可以搬运,难度小上不少=。=
    一起学习,一起进步~

    See Again~
    之前
    真爱无价,欢迎打赏~
    赞赏码

    展开全文
  • 用java实现了整数可变字节压缩为二进制流算法
  • 相关链接: Java压缩技术(一) ZLib Java压缩技术(二) ZIP压缩——Java原生实现 Java压缩技术(三) ZIP解压缩——Java原生实现 Java压缩技术(四) GZIP——Java原生实现 Java压缩技术(五) GZIP相关——...

    相关链接: 
    Java压缩技术(一) ZLib 
    Java压缩技术(二) ZIP压缩——Java原生实现 
    Java压缩技术(三) ZIP解压缩——Java原生实现 
    Java压缩技术(四) GZIP——Java原生实现 
    Java压缩技术(五) GZIP相关——浏览器解析
    Java压缩技术(六) BZIP2——Commons实现 

    Java压缩技术(七) TAR——Commons实现                                                                                                                              

    GZIP常常用在linxu环境下,是一种非常简单的压缩算法。在Java实现API中,它仅仅包含两个实现类:GZIPInputStream和GZIPOutputStream。 
    GZIPOutputStream类用于压缩 
    GZIPInputStream类用于解压缩 
     

    展开全文
  • 无损压缩算法专题——无损压缩算法介绍

    千次阅读 多人点赞 2019-12-22 19:50:21
    一、数据无损压缩的理论——信息论 数据压缩的起源是基于信息论的。信息论之父香农第一次用数学语言阐明了概率与信息冗余度的关系。在1948年发表的论文“通信的数学理论”中,香农指出,任何信息都存在冗余,冗余...

    一、数据无损压缩的理论——信息论

    数据压缩的起源是基于信息论的。信息论之父香农第一次用数学语言阐明了概率与信息冗余度的关系。在1948年发表的论文“通信的数学理论”中,香农指出,任何信息都存在冗余,冗余大小与信息中每个符号的出现概率有关。香农借鉴了热力学的概念,把信息中排除了冗余后的平均信息量称为“信息熵”,并给出了计算信息熵的数学表达式。这篇伟大的论文后来被誉为信息论的开山之作,信息熵也奠定了所有数据压缩算法的理论基础。从本质上讲,数据压缩的目的就是要消除信息中的冗余,而信息熵及相关的定理恰恰用数学手段精确地描述了信息冗余的程度。利用信息熵公式,人们可以计算出信息编码的极限。即在一定的概率模型下,无损压缩的编码长度不可能小于信息熵公式给出的结果。下面是这位帅气的美国数学家的照片,记得大学上课的时候老师PPT摆的是他年轻时的照片,周围同学一个劲地夸他帅,哈哈。

     

    信息量定义:     

           设信源x由属于集合Am={a1,a2,…,am}的m个可能的符号产生,若信源事件aj的概率为P(aj),则定义事件aj的信息量I(aj):

                                                                                        I(aj)=-log P(aj)

      取2为底的对数,则单位为比特(bit),信息量也称自信息。

    信源的熵:

           一个通信系统并非只传送1个符号,而是多个符号,这就需要定义整个信源符号的平均信息量的大小。我们把自信息的统计平均值——数学期望,称为信源x的熵。熵的大小表示非冗余的不可压缩的信息量。

     

    以上的理论和公式和理论大家只作为一个了解,其实还是很有用的,我们可以根据香农的理论来计算一个特定文件的极限压缩率。

     

    二、数据压缩的必要性及分类

    当今信息技术飞速发展。由于数字化的多媒体信息尤其是数字视频和音频信号的数据量特别庞大,如果不对其进行有效的压缩就难以得到实际的应用。像我们平常看的视频和听的音乐都是经过压缩的,最直观的感受就是看视频的时候有蓝光超清、720P等等的清晰度可以选择。MP3也有无损音质和各种有损等级的区别。如果不对数据进行压缩,那么我们平常接触到的大部分文件都是非常庞大的,像视频直播这样的技术应用都会遇到很大的阻碍,所以数据压缩是非常有必要的。

           那么问题来了,数据可以被无限压缩吗?答案可定是不能的,我们平时都会发现,被压缩过的文件就很难再被压缩了,从本质上讲,数据压缩的目的就是要消除信息中的冗余,数据压缩只不过是把海绵中的水挤压出来,再怎么用力都无法把海绵都挤的消失。

    下面我们来看看数据压缩的分类:

    无损压缩:完全还原被压缩的数据,适用于普通文件和可执行文件等不能容忍数据丢失的场合,压缩率比较小。

    有损压缩:不能完全还原被压缩的数据,适用于多媒体文件等可容忍一定数据丢失的场合,压缩率比较大。

    为什么数据压缩分为这么多的种类,统一用一种压缩算法不行吗?当然是不行的,因为面向不同的应用场合是有不同的应用需求的,一种算法在这种场合好用并不代表在另外一个场合就一定也好用,所谓“术业有专攻”说的就是这个道理。既然分为那么多的种类,就必然需要一些定性的指标来评判一个压缩算法的好坏。下面是一些压缩算法的性能指标:

    压缩比:压缩前的数据大小和压缩后的数据大小之比。

    数据质量:无损压缩不存在数据质量问题,而有损压缩数据失真情况很难量化,只能对测试的数据进行估计。

    软硬件系统:有些硬件系统有数据压缩模块,与软件系统相比速度快更快。但软件系统灵活度更高。

    压缩/解压速度:不同场合对速度性能有不同的要求。

     

    三、压缩编码

    (1)香农-范诺编码(Shannon–Fano coding)

           最早阐述和实现“从上到下”的熵编码方法的人是Shannon(1948)Fano(1949),因此称为香农-范诺(Shannon- Fano)编码法。编码步骤如下:

     

    编码举例

           现有A,B,C,D和E共5类符号,出现的次数如下表,试着对这40个符号进行香农范诺编码:

     通常情况下每个符号需要用3个比特位来编码表示,现在对这些符号进行香农-范诺编码。

    ①根据符号出现的概率对符号进行降序排列后,分出最均匀的两部分,然后在中间画一条红线分开两部分。可能有人会问最均匀是怎么判定的,简单的一个判定就是这两部的“出现次数”差值最小。举个例子,从B和C间划开两部分后第一部分“出现次数”为15+7=22,第二部分为7+6+5=18,差值为22-18=4;若从C、D间划开两部分后第一部分“出现次数为”15+7+7=29,第二部分为6+5=11,差值为29-11=18;显然从B和C间划开是差值最小的,所以从这里划开。

    划开两部分之后第一部分分配一个比特位0,第二部分分配一个比特位1,如下表所示:

    ②以此类推,将上一次分出来的各部分再进行划分,继续分配相应的比特位,于是可以得到如下的表格:

     

     ③于是得出了每个符号应该分配的编码A(00)、B(01)、C(10)、D(110)、E(111),接下来就可以对比一下压缩性能了。

    压缩前编码位数:N1 = 40 x 3 = 120

    压缩后编码位数:N2 = 30 + 14 + 14 + 18 + 15 = 91

    压缩率: (120-91) / 120 ≈ 24.2%

    问题思考:假设现在就有一个这样的文本文件等待我们去压缩,我们把这些字符统计一番然后编码后,我们再去解压的时候会遇到一个什么样的问题呢?在突然对一个文件进行解压的时候,很明显在解压的时候根本就不知道每个字符是对应什么样的编码的,就没法解压啦。所以我们需要在解压的时候知道对应关系,那么自然就需要在压缩的时候把对照表写到压缩文件里面去,告诉解压时程序每个编码对应应该解释出什么字符,类似于下图这样。

     

    译码过程

          既然讲了编码肯定也要讲讲解压文件时怎么去译码,译码时需要先获取编码码表得知每种编码所对应的真实字符,然后进行译码,因为香农-范诺编码属于前缀码,即任意一个字符的编码都不可能是另外一个字符的前缀,所以译码过程中不会导致出错。下面举个例子来理解。 

    我们读取这个解压文件的编码对照表,得出如下的表格:

    大家很容易发现一个问题,两位二进制有4种组合方式“00”、“01”、“10”、“11”,为什么编码的时候上面只用了三种却没用“11”这种组合?原因很简单,我们可以先假设有“11”这种组合的码字而且它代表的字符是“F”,那么问题来了,当译码的时候读到“11”这两个比特的数据时,我到底译码成“F”这个字符还是继续向后再读一位比特位去译码成“D”或者“E”呢?所以这里就有个冲突问题,“前缀码”的引入就是为了解决这个问题。

    理解了“前缀码”的概念之后,我们开始读取数据进行解压译码,从茫茫的数据流中,我们先读到“110”,发现表里能匹配上,然后译码成“D”,再读再与表里的字符进行匹配,依此类推,直到把整个文件数据全部解压完。

     到这里整个过程就已经结束了,有个问题还是要说下,如果保存的压缩数据中有个别比特位反转,对整体数据会有什么样的影响呢?我们假设以上的数据中某个位反转,发现之后的大片数据可能都会译码错误。究其原因是因为每个字符的编码长度是不一致的,所以出现这种状况会有很大影响,

     

    (2)霍夫曼编码(Huffman coding)

           一种 “从下到上”的编码方法。待编码的元素出现的次数越多,其编码的位数就越少,霍夫曼编码被广泛用在JPEG, MPEG, H.26X等各种信息编码标准中。编码步骤如下图:

    编码举例

           试着对有30个符号的字符串:BABACACADADABBCBABEBEDDABEEEBB,进行霍夫曼编码。

     ①首先我们照符号出现先统计一下这些字符的信息,如下表:

     ②将这些符号按概率大小降序排列,然后选择两个概率最小的符号,这里明显是C和D,组成一个节点P1,后面跟上一个小括号里面填上权重为3+4=7,如下图所示:

     ③根据上一次的结果,存在B、A、E、P1这4个节点,然后再选出两个权重(次数)最小的符号,即E和P1,然后构成新的节点P2,同样后面写上权重为5+7=12,依此类推,操作到最后只剩下一个节点为止。如下面两幅图所示:

     

     ④接下来分配码字,给每一条节点与节点之间的连线都要分配一个比特位,分配规则是给权重小的分配0,另一个权重大的分配1,如下图所示,其实0和1互换过来分配也是可以的,这没什么关系。

     ⑤从右往左顺着字符的枝节读下去就是该字符应该分配的码字了,A(10)、B(11)、C(010)、D(011)、E(00)。译码方法和前面介绍的香农范诺编码是类似的。学过数据结构的朋友肯定能看出来,这其实就是一颗二叉树,只不过转了90度而已,霍夫曼编码采用最优二叉树的形式进行编码,是理论上的最优前缀编码。

     

    (3)行程长度编码(Run-Length Coding)

            计算出相同值重复出现的次数,对相同的数据只编码一次。在JPEG,MPEG,H.261和H.263等压缩方法中,RLE用来对图像数据变换和量化后的系数进行编码。

     这种编码方式有个很明显的缺陷,当待编码的数据中重复块很少时,这种编码方式会使得压缩后的数据比原始数据还要大,所以在实际应用中都会做相应的改进。

     

    四、词典编码

    (1)词典编码的概念和分类

    词典编码的实质就是用一些短的索引来替换重复出现的数据段。LZ系列算法是最具代表性的词典编码算法。同样,举个生动形象的例子:

     看到第一行写的是“吃葡萄不吐葡萄皮”,聪明的你一定猜到下面一行写的是“不吃葡萄倒吐葡萄皮”了。为什么我下面一行没写字上去大家也能知道是什么内容?因为每个图形都代表了一串特定的字符,词典编码也是这个道理。再举个程序员懂的例子,C语言中用一个指针来指向一个字符串,我们输出字符串的时候只需要知道这个指针就行了,那么这个指针就是代表了这一大串的字符,就相当于是数据压缩了。

    第一类编码算法

    ①用已经出现过的字符串替代重复的部分。

    ②编码器的输出仅仅是指向早期出现过的字符串的“指针”。

    第二类编码算法

       ①从输入的数据中创建一个“短语词典

       ②编码器输出词典中的短语“索引号”。

     

    (2)LZSS算法原理(第一类编码)

           LZSSLZ77改进而来,又称“滑动窗口压缩”,该算法将一个虚拟的,可以跟随压缩进程滑动的窗口作为词典,要压缩的字符串如果在该窗口中出现,则输出其出现位置和长度,没出现则原样输出字符。

     编码步骤

     

    编码格式      

           如果匹配串的长度比指针本身的长度长就输出指针,否则就输出真实字符。由于输出的压缩数据流中包含有指针和字符本身,为了区分它们就需要有额外的标志位。下面举个例子,只是做个示例,实际应用不一定这么用。

     我们假设编码格式为8个字节一组,第1字节用来做标记,标记后面7个数据哪些是真实的数据,哪些是指针。

    蓝色部分的是真实数据,直接输出就可以了,后面的0x03 0x03为一组,表示在前向缓冲区的第3个数据处开始匹配3个字符,于是匹配到0x41、0x42、0x43,接下来两个数据一样的道理。 最后解压出来如下图的数据。

     举个完整过程的例子:

     

    (3)LZW算法原理(第二类编码) 

    LZW由LZ78的改进而来,编/译码过程就是不断往“字典”中添加新的数据串,并且对新的数据串进行编号,输入是字符流,输出是“字典”中的序号。

    LZW编码步骤 

    P:数据串前缀,      C:当前字符,          PC:P和C字符串的连接。

     

     (4)LZ系列算法比较 

    五、总结 

    压缩算法种类繁多,需要针对不同的场合选择不同的算法,没有最好,只有最适合的算法。写到这里也很累了现在,在这一篇只做算法的介绍,之后的一段时间里会逐步用代码去实现以上所述的算法,并研究在实际项目中的灵活运用。

    展开全文
  • 几种压缩算法

    千次阅读 2018-01-24 16:37:37
    一、 行程长度压缩  原理是将一扫描行中的颜色值相同的相邻像素用一个计数值和那些像素的颜色值来代替。... 1.PCX行程压缩方法: 该算法实际上是位映射格式到压缩格式的转换算法,该算法对于连续 出现1次的字节

    一、 行程长度压缩
      原理是将一扫描行中的颜色值相同的相邻像素用一个计数值和那些像素的颜色值来代替。
    例如:aaabccccccddeee,则可用3a1b6c2d3e来代替。对于拥有大面积,相同颜色区域的图像,
    用RLE压缩方法非常有效。由RLE原理派生出许多具体行程压缩方法: 
      1.PCX行程压缩方法: 该算法实际上是位映射格式到压缩格式的转换算法,该算法对于连续
    出现1次的字节Ch,若Ch>0xc0则压缩时在该字节前加上0xc1,否则直接输出Ch,对于连续出
    现N 次的字节Ch,则压缩成0xc0+N,Ch这两个字节,因而N最大只能为ff-c0=3fh(十进制为63),
    当N大于63时, 则需分多次压缩。 
      2.BI_RLE8压缩方法:在WINDOWS的位图文件中采用了这种压缩方法。该压缩方法编码也是
    以两个字节为基本单位。其中第一个字节规定了用第二个字节指定的颜色重复次数。 如编码 
    0504表示从当前位置开始连续显示5个颜色值为04的像素。当第二个字节为零时第二个字节有特
    殊含义:0表示行末;1表示图末;2转义后面2个字节, 这两个字节分别表示下一像素相对于当前位置
    的水平位移和垂直位移。这种压缩方法所能压缩的图像像素位数最大为8位(256色)图像。
      3.BI_RLE压缩方法: 该方法也用于WINDOWS位图文件中,它与 BI_RLE8编码类似,唯一不
    同是:BI_RLE4的一个字节包含了两个像素的颜色,因此,它只能压缩的颜色数不超过16的图像。
    因而这种压缩应用范围有限。 
      4.紧缩位压缩方法(Packbits):该方法是用于Apple公司的Macintosh机上的位图数据压缩 方法,
    TIFF 规范中使用了这种方法, 这种压缩方法与BI_RLE8压缩方法相似,如1c1c1c2132325648 压
    缩为:83 1c 21 81 32 56 48,显而易见, 这种压缩方法最好情况是每连续128个字节相同,这128
    个字节可压缩为一个数值7f。这种方法还是非常有效的。

    二、霍夫曼编码压缩:
      也是一种常用的压缩方法。是1952年为文本文件建立的,其基本原理是频繁使用的数据用较短
    的代码代替,很少使用的数据用较长的代码代替,每个数据的代码各不相同。这些代码都是二进制码,
    且码的长度是可变的。如: 有一个原始数据序列,ABACCDAA则编码为A(0),B(10),C(110),(D111),
    压缩后为010011011011100。产生霍夫曼编码需要对原始数据扫描两遍,第一遍扫描要精确地统计
    出原始数据中的每个值出现的频率,第二遍是建立霍夫曼树并进行编码,由于需要建立二叉树并遍历
    二叉树生成编码,因此数据压缩和还原速度都较慢,但简单有效,因而得到广泛的应用。
    哈夫曼编码是无损压缩当中最好的方法。它使用预先二进制描述来替换每个符号,长度由特殊符号出
    现的频率决定。常见的符号需要很少的位来表示,而不常见的符号需要很多为来表示。
    哈夫曼算法在改变任何符号二进制编码引起少量密集表现方面是最佳的。然而,它并不处理符号的顺
    序和重复或序号的序列。


    三、LZW压缩方法
      LZW压缩技术比其它大多数压缩技术都复杂, 压缩效率也较高。其基本原理是把每一个第一次出
    现的字符串用一个数值来编码,在还原程序中再将这个数值还成原来的字符 串,如用数值0x100代替
    字符串"abccddeee"这样每当出现该字符串时,都用0x100代替,起到了压缩的作用。 至于0x100与字
    符串的对应关系则是在压缩过程中动态生成的,而且这种对应关系是隐含在压缩数据中,随着解压缩的
    进行这张编码表会从压缩数据中逐步得到恢复,后面的压缩数据再根据前面数据产生的对应关系产生更
    多的对应关系。直到压缩文件结束为止。LZW是可逆的, 所有信息全部保留。
    属于无损压缩编码,该编码主要用于图像数据的压缩(如GIF)。对于简单图像和平滑且噪声小的信号
    源具有较高的压缩比,并且有较高的压缩和解压缩速度。 
    LZW压缩技术把数据流中复杂的数据用简单的代码来表示,并把代码和数据的对应关系建立一个转换表,
    又叫“字符串表”。 
         转换表是在压缩或解压缩过程中动态生成的表,该表只在进行压缩或解压缩过程中需要,一旦压
    缩和解压缩结束,该表将不再起任何作用。

    四、算术压缩方法
      算术压缩与霍夫曼编码压缩方法类似,只不过它比霍夫曼编码更加有效。算术压缩适合于由相同的
    重复序列组成的文件,算术压缩接近压缩的理论极限。这种方法,是将不同的序列映像到0到1之间的区
    域内,该区域表示成可变精度(位数 )的二进制小数,越不常见的数据要的精度越高(更多的位数),这种
    方法比较复杂,因而不太常用。


    五、Rice
    对于由大word(例如:16或32位)组成的数据和教低的数据值,Rice编码能够获得较好的压缩比。音频
    和高动态变化的图像都是这种类型的数据,它们被某种预言预处理过(例如delta相邻的采样)。

    尽管哈夫曼编码处理这种数据是最优的,却由于几个原因而不适合处理这种数据(例如:32位大小要求
    16GB的柱状图缓冲区来进行哈夫曼树编码)。因此一个比较动态的方式更适合由大word组成的数据。
    Rice编码背后的基本思想是尽可能的用较少的位来存储多个字(正像使用哈夫曼编码一样)。实际上,有
    人可能想到Rice是静态的哈夫曼编码(例如,编码不是由实际数据内容的统计信息决定,而是由小的值比
    高的值常见的假定决定)。

    编码非常简单:将值X用X个‘1’位之后跟一个0位来表示。

    六、Lempel-Ziv (LZ77)
    Lempel-Ziv压缩模式有许多不同的变量。基本压缩库有清晰的LZ77算法的实现(Lempel-Ziv,1977),执
    行的很好,源代码也非常容易理解。

    LZ编码器能用来通用目标的压缩,特别对于文本执行的很好。它也在RLE和哈夫曼编码器(RLE,LZ,哈
    夫曼)中使用来大多数情况下获得更多的压缩。
    在LZ压缩算法的背后是使用RLE算法用先前出现的相同字节序列的引用来替代。

    简单的讲,LZ算法被认为是字符串匹配的算法。例如:在一段文本中某字符串经常出现,并且可以通过前
    面文本中出现的字符串指针来表示。当然这个想法的前提是指针应该比字符串本身要短。

    例如,在上一段短语“字符串”经常出现,可以将除第一个字符串之外的所有用第一个字符串引用来表示
    从而节省一些空间。

    一个字符串引用通过下面的方式来表示:

    1.  唯一的标记

    2.  偏移数量

    3.  字符串长度

    由编码的模式决定引用是一个固定的或变动的长度。后面的情况经常是首选,因为它允许编码器用引用的
    大小来交换字符串的大小(例如,如果字符串相当长,增加引用的长度可能是值得的)。


    七、DEFLATE是同时使用了LZ77算法与哈夫曼编码(Huffman Coding)的一个无损数据压缩算法。它最
    初是由Phil Katz为他的PKZIP归档工具第二版所定义的,后来定义在RFC 1951规范中。

    人们普遍认为DEFLATE不受任何专利所制约,并且在LZW(GIF文件格式使用)相关的专利失效之前,这
    种格式除了在ZIP文件格式中得到应用之外也在gzip压缩文件以及PNG图像文件中得到了应用。

    DEFLATE压缩与解压的源代码可以在自由、通用的压缩库zlib上找到。

    更高压缩率的DEFLATE是7-zip所实现的。AdvanceCOMP也使用这种实现,它可以对gzip、PNG、MNG以
    及ZIP文件进行压缩从而得到比zlib更小的文件大小。在Ken Silverman的KZIP与PNGOUT中使用了一种更加
    高效同时要求更多用户输入的DEFLATE程序。

     

     

    还有另外一篇文章也介绍了几种算法,有些地方会比此处讲得易懂:
    http://www.360doc.com/content/11/1009/17/113573_154661529.shtml

     

     
      *********************************** 外部链接***************************************

     

     

    展开全文
  • 一、压缩原理 压缩原理其实很简单,就是找出那些重复出现的字符串,然后用更短的符号代替, 从而达到缩短字符串的目的。比如,有一篇文章大量使用"中华人民共和国"这个词语, 我们用"中国"代替,就缩短了 5 个字符...
  • 几种常见的压缩算法原理

    千次阅读 2020-10-01 11:17:14
    图 2.1 显示了一个如何使用 RLE 算法来对一个数据编码的例子,其中出现六次的符号‘ 93 ’已经用 3 个字节来代替:一个标记字节(‘ 0 ’在本例中)重复的次数(‘ 6 ’)和符号本身(‘ 93 ’)。 RLE 解码器遇到...
  • Java压缩算法性能比较

    千次阅读 2018-04-24 16:30:32
    经常在玩家进入游戏的时候进行必要的信息初始化,往往这个初始化信息数据包是相对来说还是比较大的,一般在30-40kb左右,还是有必要进行压缩一下再发送消息,刚好前段时间看过,里面列举了一些常用的压缩算法,...
  • 无损压缩经典算法

    万次阅读 多人点赞 2016-10-25 22:54:04
    @前言总结经典的文件压缩算法原理,主要包括:哈夫曼压缩算法及其延伸,LZ77算法及其演变算法,LZ78算法及其演变算法,几何编码算法Arithmetic Coding。内容部分摘录翻译自港大‘多媒体技术’硕士课程1.进行文件压缩...
  • 全栈工程师开发手册 (作者:栾鹏) ...java使用zip算法压缩压缩文件、数据、byte[]字节数组 测试代码 public static void main(String[] args) { try { // 压缩文件 ZipUtils.compress("d:\\
  • 几种压缩算法原理介绍

    千次阅读 2017-08-06 01:53:56
    1 RLE RLE 又叫 Run Length Encoding ,是一个针对无损压缩的非常简单的算法。...图 2.1 显示了一个如何使用 RLE 算法来对一个数据编码的例子,其中出现六次的符号‘ 93 ’已经用 3 个字节来代替:一个标
  • 最近自己实现了一个ZIP压缩数据的解压程序,觉得有必要把ZIP压缩格式进行一下详细总结,数据压缩是一门通信原理和计算机科学都会涉及到的学科,在通信原理中,一般称为信源编码,在计算机科学里,一般称为数据压缩,...
  • Java数据压缩与传输实例 1个目标文件 摘要:Java源码,文件操作,数据压缩,文件传输 Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入压缩输入、文件输出、实例化缓冲区、写入数据到文件、...
  • 全栈工程师开发手册 (作者:栾鹏) java教程全解 ...ZLib可以简单的理解为压缩/解压缩算法,它与ZIP、RAR等归档算法有所不同,与bzip2比较接近。 测试代码public static void main(String[] args) { //测
  • 通过gzip解压缩[]byte //压缩 func GZipBytes(data []byte...in) //面向api编程调用压缩算法的一个api //参数就是指向某个数据缓冲区默认压缩等级是DefaultCompression 在这里还有另一个api可以调用调整压缩级别 ...
  • 这个特定的LZJB生成与HexEd.it期望相同的字节流。 其他的(例如 )则没有。 请注意, Iuppiter.js的Base64实现似乎不兼容,不正确或有故障。 您应该使用btoa() ,例如: // "bytes" is an array of integers ...
  • 几种压缩算法实现原理详解

    千次阅读 2019-08-16 10:49:05
    gzip、zlib以及图形格式png,使用的压缩算法都是deflate算法。从gzip的源码中,我们了解到了defalte算法的原理和实现。我阅读的gzip版本为gzip-1.2.4。下面我们将要对deflate算法做一个分析和说明。...
  • 压缩算法gorilla paper encoding原理

    千次阅读 热门讨论 2018-09-06 19:06:58
    目录 引: IEEE754 浮点数简述 举例 算法原理 ...压缩结构 ...压缩率测试 ...从之前研究TSM文件格式,发现float类型的value是以facebook的gorilla paper encoding的算法进行压缩。...这个算法是float的压缩,首先...
  • 字节流的方式,只读打“Pic.bmp”文件。 逐字节读取文件,统计文件中256种字节重复的次数,保存到一个数组中int weight[256]中。 (2)生成Huffman树 根据(1)中统计的结果,构建Huffman树。定义一个结构体来记录每...
  • 数据压缩算法—2无损压缩算法

    千次阅读 2018-12-12 20:55:43
      字典算法是最为简单的压缩算法之一。它是把文本中出现频率比较多的单词或词汇组合做成一个对应的字典列表,并用特殊代码来表示这个单词或词汇。例如:   有字典列表:   00=Chinese   01=People   02=...
  • java使用BZip算法压缩压缩文件、数据、byte[]字节数组需要添加org.apache.commons.compress包,下载测试代码public static void main(String[] args) { try { String inputStr = "zlex@zlex
  • android 图片压缩算法-luban

    千次阅读 2018-02-27 19:35:54
    图片压缩算法-luban luban 鲁班算法是号称最接近微信朋友圈图片压缩算法的一种图片压缩算法,GitHub 地址: https://github.com/Curzibn/Luban 根据作者提供的数据,压缩效果如下: 内容 原图 Luban ...
  • 十款性能最佳的压缩算法

    千次阅读 2020-05-31 00:05:22
    数据压缩是保留相同或绝大部分数据前提下减小文件大小的过程。它的原理是消除不必要的数据或以更高效的格式重新组织数据。在进行数据压缩时,你可以选择使用有损方法或无损方法。有损方法会永久性地擦...
  • 浅析数据压缩算法

    千次阅读 2017-05-17 15:51:17
    数据压缩是减少信息传输量最经济直接的办法,所以这篇文章将讲解一些经典的数据压缩算法。 一 热身:基因组 对于生物学的基因研究中,A、C、T、G是是用来表示生物DNA的四种碱基,对基因序列的处理实际上是对这四种...
  • 常见的文本压缩算法

    万次阅读 2017-08-15 14:32:18
    1.目前主要的文本压缩算法 文本压缩是根据一定的方法对大量数据进行编码处理以达到信息压缩存储的过程,被压缩的数据应该能够通过解码恢复到以前的状态,而不会发生信息丢失的现象。2.文本压缩的分类 3.算法描述...
  • 无损压缩算法专题——LZSS算法实现

    千次阅读 2019-12-28 12:17:44
    本文是基于我的上一篇博客《无损压缩算法专题——无损压缩算法介绍》的基础上来实现的,博客链接https://blog.csdn.net/qq_34254642/article/details/103651815,这一篇当中实现基本的LZSS算法功能,先不做改进,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 50,201
精华内容 20,080
关键字:

压缩字节流的算法