当前位置: 首页 > 面试题库 >

压缩后的输出不同于Go to Ruby的实现

曹超
2023-03-14
问题内容

我正在实现一个程序,将文件分解为git blob并适当地存储它。

我有一个基于git书的文章的ruby参考实现

我正在尝试在这里实施

但是,我遇到了一个问题,即每个实现中存储的压缩数据略有不同。

vbindiff显示前2个字节是相同的(如从该测试脚本运行)(如果我没有看错)。这些字节分别存储压缩方法,标志和标志(根据https://tools.ietf.org/html/rfc1950)。第三个字节是差异开始的地方,这可以是字典ID或原始输入数据的开始。数据将保持相似,直到接近文件末尾。我假设这可能是ADLER32校验和中的差异。

似乎默认情况下,zlib的go和Ruby实现都不会将字典传递给zlib(按照go
zlib源代码
和ruby
zlib源代码

数据看起来相同。

我不确定库中是否存在实现错误,或者我只是缺少什么。

为什么这些输出不同?


问题答案:

RFC 1951中定义的deflate算法(以RFC 1950定义的zlib格式以及RFC
1952定义的gzip格式使用)允许实现中的变化,这些变化可能导致压缩时产生不同的结果。但是这些结果仍将解压缩为相同的值。这允许在压缩时间到压缩级别之间进行权衡,并使像zopfli这样的程序成为可能,该程序比原始zlib库实现更好的压缩(以明显更长的压缩时间为代价)。

Go使用自己编写的Go语言编写的deflate算法,而ruby使用zlib库。这就是您的html" target="_blank">示例在同一输入上创建不同的压缩输出的原因。但是,如果您从Go或Ruby程序中获取输出并解压缩(无论是使用Ruby还是Go或任何符合标准的实现),则将再次得到完全相同的值。



 类似资料:
  • 本文向大家介绍webpack 如何同时输出压缩和未压缩的文件的实现步骤,包括了webpack 如何同时输出压缩和未压缩的文件的实现步骤的使用技巧和注意事项,需要的朋友参考一下 有的时候我们想要同时生成压缩和未压缩的文件,比如我们构建 lib 包的时候,我们希望用户能够使用压缩过后的代码文件作为 cdn 文件,最简单的一个方式就是通过指定环境变量,比如指定 MINIFY,如下: 我们在使用的时候通过

  • 本文向大家介绍基于Node.js实现压缩和解压缩的方法,包括了基于Node.js实现压缩和解压缩的方法的使用技巧和注意事项,需要的朋友参考一下 压缩格式 zip 和 gzip 是两种我们最常见到的压缩格式,当然,gzip 在 Windows 下很少有人接触。 tar 是一种归档格式,它默认不会压缩,需要结合 gzip 来将最终的 tar 文件以 gzip 格式压缩成为一个 tar.gz 文件,通常

  • 本文向大家介绍C#实现的文件压缩和解压缩类,包括了C#实现的文件压缩和解压缩类的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#实现的文件压缩和解压缩类。分享给大家供大家参考。具体分析如下: 这个C#代码包含了几个类,封装了文件压缩和解压缩常用的方法,包括直接通过代码进行压缩,也有调用winrar对文件进行压缩的 希望本文所述对大家的C#程序设计有所帮助。

  • 问题内容: 从两个列表中选择列表的最快,最优雅的方法是什么? 我有 我想要 我当时在考虑使用map而不是zip,但我不知道是否有一些标准库方法作为第一个参数。 我可以为此定义自己的功能,并使用map,我的问题是是否已经实现了某些功能。 否 也是答案。 问题答案: 如果您要压缩2个以上的列表(就此而言,甚至压缩2个),一种可读的方式将是: 这使用列表推导并将列表(元组)中的每个元素转换为列表。

  • 本文向大家介绍基于pako.js实现gzip的压缩和解压功能示例,包括了基于pako.js实现gzip的压缩和解压功能示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了基于pako.js实现gzip的压缩和解压功能。分享给大家供大家参考,具体如下: 运行效果图如下: poko.js可至Github下载:https://github.com/nodeca/pako 或者点击此处本站下载。

  • 问题内容: 如果我在某个对象上调用该方法,它将返回该对象的内部地址(默认实现)。该地址是逻辑地址还是物理地址? 在垃圾回收中,由于内存压缩,对象在内存中发生移位。如果我在GC之前和之后调用哈希码,它将返回相同的哈希码(返回),如果是,则为什么(由于压缩地址可能会更改)? 问题答案: @erickson或多或少是正确的。返回的哈希码在对象的生存期内不变。 (通常)实现此方法的方式非常聪明。当对象由垃