Zlib ruby - 如何在处理数据之前检查数据是否为 ​​deflated/compressed?

Zlib ruby - how to check if data is deflated/compressed before processing it?

我的情况是数据库中的某些数据未压缩,但我想为传入的新数据启用压缩,而不必更新数据库中当前的所有记录以压缩它们。

所以我需要能够说,如果放气,就给它充气并处理它,否则就处理它。但是我看不到如何在尝试处理数据之前优雅地检查数据是否已经压缩,除非我做一个 'begin ... rescue' 块:

begin 
  process(Zlib::Inflate.inflate(data))
rescue Zlib::DataError
  process(data) 
end 

有没有更好的方法?我看到了对幻数的引用并检查了文件的前几个字节,但是在 ruby 中没有很好的例子来说明如何实现这些事情。任何帮助表示赞赏。谢谢。

正如您所建议的,您可以挽救特定异常或通过读取幻数手动验证文件类型。

RubyIO的readpartial可以读取指定字节数,可以和magic number比较

我个人会坚持拯救异常,因为许多核心库在引发异常之前执行相同的幻数检查。

你提出的是最好的方法。它将很快确定前两个字节不是 zlib header。如果意外地输入数据似乎是 zlib header(大约 1024 分之一的机会),那么解压缩将几乎始终检测到给定随机数据的无效放气流,大约 30 个字节。