V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
lxk11153
V2EX  ›  问与答

zip, unzip (zipinfo) 压缩级别问题

  •  
  •   lxk11153 · 2020-08-10 08:39:13 +08:00 · 1842 次点击
    这是一个创建于 1347 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • zip -1 a.zip file.test

    • zip -9 b.zip file.test

    • 解压的话都是 unzip a/b.zip

      有了解 zip 压缩算法的吗 -> 为啥解压时不用指定级别? 1. 是因为它真的不需要吗?(可以解释下吗) 2. 还是说它从压缩包里读出来了?(那 zipinfo 可以输出当时 zip 所用的级别吗)

    8 条回复    2020-08-10 15:58:51 +08:00
    cheng6563
        1
    cheng6563  
       2020-08-10 09:07:45 +08:00 via Android
    用 zip 就是奔着速度而不是压缩率去的,所以没人设置这个了
    sNullp
        2
    sNullp  
       2020-08-10 09:09:03 +08:00
    1 和 9 只是在压缩的时候用多复杂的字典和一些别的参数,从解压缩的角度来说算法是一样的。
    tairan2006
        3
    tairan2006  
       2020-08-10 09:14:54 +08:00
    这就跟你用 bcrypt 加密一样,10 遍或者 20 遍,只是计算量不一样,解密的时候都是同一个算法啊。
    lxk11153
        4
    lxk11153  
    OP
       2020-08-10 09:17:28 +08:00
    @cheng6563 #1 用 zip 就是举例,换其它算法也有可以套在这问题上的吧
    chenset
        5
    chenset  
       2020-08-10 09:31:43 +08:00   ❤️ 1
    zip 格式文件头(文件的前几十字节)里面有一大段个描述信息的. 类似 TCP/HTTP 都是在文件头里面保存着很多这些参数
    no1xsyzy
        6
    no1xsyzy  
       2020-08-10 13:57:31 +08:00   ❤️ 1
    应该是没有存储具体值的,首先 zip 本身会表述算法,但子算法很可能不会表述
    man zip
    ...
    -#
    ...
    Though still being worked, the intention is this setting will control compression speed for all compression methods. Currently only deflation is controlled.
    可知 deflation 算法才可以控制

    man zipinfo
    ...
    Finally, the sixth field indicates the compression method and possible sub-method used.
    看得出具体的子算法是 `possible`,即推测出的。

    实际上生成了 cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 100K | cat > file
    然后 for i in {1..9}; do zip -$i v$i.zip file; done
    测试的结果上来说,
    zipinfo 指示 v1..v2 是 defF,v3..v7 是 defN,v8..v9 是 defX,都是 deflation 算法。
    压缩结果大小上来说,v1>v2=v3>v4=v5..=v9
    diff 的结果,v8==v9,v4==v5==v6==v7
    就这样吧

    顺便一提,zip -v 显示 2008,zipinfo -v 显示 2009…… 十年没更新了……
    impl
        7
    impl  
       2020-08-10 14:51:27 +08:00 via Android
    zip 只是封装格式,默认用 deflate 算法。
    msg7086
        8
    msg7086  
       2020-08-10 15:58:51 +08:00   ❤️ 1
    压缩级别是指用多大的力气去从原始数据里抠掉冗余数据。

    用视频压缩来举例子。比如说第一帧画面上有一只猫。第二帧这只猫往左移动了 1 像素。第三帧这只猫往左又往上移动了 1 像素。第四帧这只猫往左移动了 30 像素。

    假如你的视频压缩算法没有动态搜索功能,那么每一帧都要单独画出一张猫来,就相当于 4 张图片连在一起,4 倍的大小。

    假如你的算法能做上下和左右 1 像素的动态搜索,那么第二帧的图像就可以被搜索到是第一帧移动后的结果,那么第二帧就可以只保存残差而不需要保存完整的图片了。

    假如你的算法能做上下左右和斜线 1 像素的动态搜索,那么第三帧的图像也可以搜索到动态矢量了。

    假如你的算法能做整个画面所有像素的动态搜索,那么第四帧就算是差了 30 像素也可以搜索到动态矢量了。

    第一种算法处理一下只要 5 毫秒,第二种要 10 毫秒,第三种要 20 毫秒,第四种要 1000 毫秒。

    至于解码,当然只需要根据图片和动态信息来还原数据就行了,不管是差 1 像素还是差 30 像素,还原的过程都是一样的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   936 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 21:34 · PVG 05:34 · LAX 14:34 · JFK 17:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.