压缩输出与 Go to Ruby 实现不同

2024-01-10

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

我有一个红宝石参考实现 https://github.com/sgen/git-deflate/blob/bugfix/deflate/deflate-file这是基于git 书中的一篇文章 https://git-scm.com/book/en/v2/Git-Internals-Git-Objects

我正在尝试在 go 中实现这个here https://github.com/sgen/git-deflate/blob/bugfix/deflate/main.go

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

vbindiff显示前 2 个字节是相同的(从这个测试脚本 https://github.com/sgen/git-deflate/blob/bugfix/deflate/test-git-deflate)(如果我没看错的话)。这些字节分别存储压缩方法和标志以及标志(根据https://www.rfc-editor.org/rfc/rfc1950 https://www.rfc-editor.org/rfc/rfc1950)。第三个字节是差异开始的地方,它要么是字典 ID,要么是原始输入数据的开始。数据保持相似,直到接近文件末尾。我假设这可能是 ADLER32 校验和的差异。

默认情况下,zlib 的 go 和 Ruby 实现似乎都不会向 zlib 传递字典(根据转到 zlib 源 https://golang.org/src/compress/zlib/reader.go?s=2009:2059#L60 and ruby zlib 源 https://github.com/ruby/zlib/blob/master/ext/zlib/zlib.c#L1622)

数据看起来相同。

我不确定库中是否存在实现错误,或者我是否遗漏了某些内容。

为什么这些输出不同?


RFC 1951 中定义的 deflate 算法(用于 RFC 1950 定义的 zlib 格式以及 RFC 1952 定义的 gzip 中)允许实现中的变化,这可能会在压缩时导致不同的结果。但这些结果仍然会解压缩到相同的值。这允许在压缩时间和压缩级别之间进行权衡,并且还使得像这样的程序zopfli https://github.com/google/zopfli可能实现比原始 zlib 库更好的压缩(以明显更长的压缩时间为代价)。

Go 使用自己的用 Go 编写的 deflate 算法实现,而 ruby​​ 使用zlib库 https://zlib.net/。这就是您的示例在同一输入上创建不同压缩输出的原因。但是,如果您从 Go 或 Ruby 程序中获取输出并再次解压缩(无论是使用 Ruby 还是 Go 或任何符合标准的实现),它都会得到完全相同的值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

压缩输出与 Go to Ruby 实现不同 的相关文章

  • 将对象转换为哈希,然后将其保存到用户的列

    找不到任何接近我想做的事情 我想将一个对象存储到用户的列中 该列采用数组的形式 postgres def change add column users interest string array true default end 我有另一
  • 使用 HTTPClient 发布嵌套参数(哈希)

    我需要从一个应用程序到另一个应用程序的多部分 http 帖子 其中包括文件附件和嵌套的参数哈希 我尝试使用HTTPClient这适用于文件附件 但是我无法获取以嵌套格式发送的参数 data params Hash new data para
  • 错误:执行 gem 时... (Gem::FilePermissionError)

    我检查了所有其他类似的答案 没有一个与我的完全一样 这些解决方案也不适合我 gem environment and sudo gem environment给出相同的结果 RubyGems Environment RUBYGEMS VERS
  • 使用yard创建文档时如何防止[查看源代码]链接?

    我正在使用yard生成项目文档 但我不想在文档中显示 查看源代码 链接 我已深入研究yard官方指南 但仍然没有得到解决方案 有什么想法吗 谢谢 我可能有点晚了 但您可以通过从 method details 部分中删除 源 部分来轻松自定义
  • 如何修复“缺少表的 FROM 子句条目”错误

    我正在尝试根据游戏 ID 获取平台名称 我有如下三个表 我正在尝试加入它们以获得所需的结果 Games Id 1 2 3 4 Game Platforms Id game id platform id 1 1 1 2 1 2 3 3 3
  • 处理 Rails 2.1.x 中的 RoutingError 的最佳方法?

    我正在使用Rails 2 1 中的routing rb 代码 并尝试让它达到这样的程度 我可以对找不到合适路径时抛出的RoutingError 异常执行一些有用的操作 这是一个有点棘手的问题 因为有一些 URL 类别纯粹是糟糕的 azenv
  • 如何将接口转换为接口切片?

    我的输入是interface 而且我知道它可以是任何类型的数组 我想读取我输入的元素之一 所以我尝试将我的interface 进入一个 interface 但是 go 会给我以下错误 恐慌 接口转换 interface 是 map stri
  • rake cucumber 和 rake spec 始终使用“开发”环境

    我运行 Cucumber 和 RSpec 测试的 rake 任务始终使用我的development环境 以下是相关的配置文件 RAILS ROOT config environments cucumber rb Edit at your o
  • Ruby/Rails - 如何创建类并从控制器访问它

    我一直在尝试使用一些不同的 gem 在 Rails 3 中显示谷歌地图 但遇到了一些问题 幸运的是我发现了这个https github com YouthTree bhm google maps https github com Youth
  • 如何将枚举作为字符串存储到rails中的数据库中

    如何在 ruby 中创建迁移 其中默认值是字符串而不是整数 我想将枚举存储到数据库中 但我不想将其存储为整数 因为这样对于另一个应用程序来说没有意义想要使用同一张桌子 我该怎么做default female 代替default 0 clas
  • 黄瓜测试java例子?

    我想尝试使用黄瓜测试的示例应用程序 黄瓜测试可以仅使用 ruby 完成 也可以使用 java 完成 请帮我举一个示例 谢谢 您可以查看我们在我们这里编写的一个简单示例来演示 cucumber jvm https github com gph
  • STI 在遗传类型之间发生变化。

    在我的模型中 我像这样使用 STI 车辆型号 vehicle rb class Vehicle lt ActiveRecord Base end 车型 car rb class Car lt Vehicle end 总线模型 bus rb
  • Ruby 自定义字符串排序

    输入字符串 1654AaBcDddeeFF 输出字符串 1456acddeeABDFF 我尝试过的代码 test array 1654AaBcDddeeFF each byte do char test array lt lt char e
  • Mac + Ruby:无法访问 Socket 的 ioctl?怎么修?

    一天中的好时光 红宝石代码 def hw address iface sock Socket new Socket AF INET Socket SOCK DGRAM 0 buf iface pack a16h16 sock ioctl S
  • 如何将所有GET请求查询参数放入Go中的结构体中?

    你好 我想将 get 查询参数转换为 Go 中的结构 例如我有这样的结构 type Filter struct Offset int64 json offset Limit int64 json limit SortBy string js
  • rspec 测试 has_many :through 和 after_save

    我有一个 我认为 相对简单的has many through与连接表的关系 class User lt ActiveRecord Base has many user following thing relationships has ma
  • 为什么 C# ProcessStartInfoRedirectStandardOutput 会导致 xcopy 进程失败

    这有点痛苦 因为我现在没有代码 但我会尽力解释 我有一个简单的 C 应用程序 它启动 Ruby 脚本 它还执行一些其他操作 因此它生成一个批处理文件并执行该文件 我正在使用 C 进程对象并设置以下内容 重定向标准输出 true 重定向标准错
  • 与heroku配合使用的统计引擎

    我有一个 Heroku Rails 应用程序 需要处理一些重要的数字 并且我需要使用像 R 这样的统计库 更糟糕的是 MatLab 我正在寻找以下任何问题的答案 是否有不需要二进制文件的功能齐全的统计包 GEM 是否可以将 R 二进制文件作
  • Ruby 中的方法和属性有什么区别?

    你可以给我一个例子吗 属性只是一个捷径 如果你使用attr accessor要创建属性 Ruby 只需声明一个实例变量并为您创建 getter 和 setter 方法 既然你要求一个例子 class Thing attr accessor
  • 在 Ruby 控制台应用程序中获取键盘事件(无需按“Enter”输入)的最佳方法是什么?

    我在互联网上寻找这个答案已经有一段时间了 发现其他人也在问同样的事情 即使在这里也是如此 因此 这篇文章将介绍我的案例以及对我找到的 解决方案 的回应 我对 Ruby 很陌生 但出于学习目的 我决定创建一个 gem here https g

随机推荐

  • RxJS first() for Observable.of() - 序列中没有元素

    对于我的测试 我试图用以下方法模拟事件流Observable of 但当我尝试时 const actions Observable of in the function that is tested actions filter actio
  • VS 2015编译cocos2d-x 3.3错误“fatal error C1189: #error: MacroDefinition of snprintf与标准库函数声明冲突”

    当我使用Visual Studio 2015编译cocos2d x 版本3 3 时 出现错误 说 致命错误 C1189 error snprintf 的宏定义与标准库函数声明冲突 编译源文件 base s3tc cpp 源代码是 ifdef
  • 使用Delphi消费oData服务建议

    我即将启动一个需要 Delphi XE Windows 32 客户端来使用的项目oData http www odata org 网络服务 我可以使用一些粗略和可读的测试代码正确查询服务 但是编写一个框架来处理 oData 协议 所有过滤
  • 如何使用 Kotlin 修复此错误,找不到 Fragment 构造函数?

    我正在开发Android使用 Kotlin 的应用程序 在我的应用程序中包含Tab with ViewPager所以我实现了两个选项卡 当我移动到另一个活动并压缩到选项卡视图活动时 应用程序将停止并且logcat显示下面的错误 java l
  • 如何使用模板创建排序映射整数索引

    我有数据结构 template
  • 使用 C# 删除换行符

    我从名为 Description 的数据库字段获取一个字符串 它有换行符 它看起来像这样 项目标题 此处为描述 这是项目的描述 我怎样才能删除换行符 我尝试了以下功能 但它不起作用 public string FormatComments
  • 设置div动态填充剩余高度?

    所以 我的代码类似于 div style width 100 min height 1 display block background color 000 img src header image svg div div Some con
  • 在 Python 中检测 NUMLOCK / CAPSLOCK / SCRLOCK 按键/按键

    在我正在开发的游戏中 我想检测NUMLOCK keypress or keyup 就像在按下时注册一个 回调 函数 我并不是要求阅读它state在某一特定时刻 我已经可以做到了 https github com MestreLion pyr
  • 有没有办法在设置类的任何属性时调用方法?

    因此 我想做的是在设置 C 类中的任何属性时调用单个 propertyWasSet 函数 相反 在获取属性时调用 propertyWasGot 我还想知道调用了哪个属性的 get 我想维护一个 设置 属性的字典 并检查 获取 操作是否已设置
  • Angular 库包依赖项

    我使用 CLI 创建并捆绑了一个 Angular 7 2 0 库 ng g 库 MyLibrary ng 构建 MyLibrary 这给了我my libary umd js我需要的捆绑包 目前 所有依赖项都作为peerDependency
  • 如何在同一场战争的多个 jar 中使用相同的 CamelContext

    我使用的是camel 2 16 2 我需要在多个jar 中使用一个 CamelContext 因为我需要将所有 Camel 路由器放入一个 CamelContext 中 所以我的战争将把所有这些罐子作为 Maven 工件 请告诉我如何处理上
  • 设施位置的动态规划算法

    沿着一条线 在位置 a 1 a 2 a n 处有 n 栋房屋 我们希望沿着同一条线设置移动便盆 以便每间房屋都位于至少一个移动便盆的距离 R 内 这些便携式便盆仅限于指定位置 b 1 b 2 b m 令 c i 为在位置 b i 设置移动便
  • openapi-generator 复制 swagger-ui 中的端点

    openapi generator maven plugin 版本 6 3 0 在 Spring Boot 3 应用程序中配置如下
  • 分区比排序更容易吗?

    这是一个在我脑海里徘徊了一段时间的问题 假设我有一个项目列表和它们的等价关系 并且比较两个项目需要恒定的时间 我想退回一部分物品 例如链表的列表 每个链表包含所有等效项 实现此目的的一种方法是将等价性扩展到项目的排序并对其进行排序 使用排序
  • 在无向图中记录 DFS 搜索中的前驱

    我试图使用此线程中的代码 提升DFS back edge https stackoverflow com questions 19346820 boost dfs back edge 19391511 noredirect 1 commen
  • String.count() 是如何工作的? [复制]

    这个问题在这里已经有答案了 我是 python 和学习的新手 如所给出的here https www tutorialspoint com python string count htm count 方法在字符串上使用时给出子字符串在字符串
  • 如何为Java类创建两个接口,一个只读,一个读写?

    我正在用 Java 为一款两人纸牌游戏编写一个游戏引擎 我的学生将为该游戏编写 AI 玩家 人工智能玩家将轮流在他们面前的 桌子 的 场地 上打牌 他们可以用自己场上的牌攻击对方场上的牌 卡片可以面朝上或面朝下 GameEngine 类允许
  • 如何根据构建变体更改 AndroidManifest.xml 文件?

    我有一个具有多个构建变体的应用程序 这些变体用于为不同公司构建同一应用程序的版本 因此 我有几个不同的变体来构建不同的应用程序 com acme app1 com schmoe app2 com yop app3 etc build gra
  • 指定服务返回字段的最佳方法

    我们使用 Java EE 7 和 WildFly 9 来开发移动 Web 应用程序的自定义后端 后端是一个经典的三层系统 具有通信逻辑 JAX RS 业务逻辑 Session EJB 和持久层 Hibernate 业务逻辑层由一组服务组成
  • 压缩输出与 Go to Ruby 实现不同

    我正在实现一个程序 将文件压缩为 git blob 并适当存储它 我有一个红宝石参考实现 https github com sgen git deflate blob bugfix deflate deflate file这是基于git 书