24

我有一个 Web 应用程序(ruby on rails),它发送一些 YAML 作为隐藏输入字段的值。

现在我想减小发送到浏览器的文本的大小。传输最少数据的最有效的无损压缩形式是什么?我可以在服务器端产生额外的压缩和解压缩成本。

4

1 回答 1

64

您可以使用 ruby​​ 核心中的 zlib 实现来输入/放气数据:

require "zlib"
data = "some long yaml string" * 100
compressed_data = Zlib::Deflate.deflate(data)
#=> "x\x9C+\xCE\xCFMU\xC8\xC9\xCFKW\xA8L\xCC\xCDQ(.)\xCA\xCCK/\x1E\x15\x1C\x15\x1C\x15\x1C\x15\x1C\x15\x1C\x15\x1C\x15\x1C\x15D\x15\x04\x00\xB3G%\xA6"

您应该对压缩数据进行 base64 编码以使其可打印:

require 'base64'
encoded_data = Base64.encode64 compressed_data
#=> "eJwrzs9NVcjJz0tXqEzMzVEoLinKzEsvHhUcFRwVHBUcFRwVHBUcFUQVBACz\nRyWm\n"

稍后,在客户端,您可能会使用pako(到 javascript 的 zlib 端口)来取回您的数据。这个答案可能会帮助您实现 JS 部分。

为了让您了解这是多么有效,以下是示例字符串的大小:

data.size            # 2100
compressed_data.size #   48
encoded_data.size    #   66

在客户端压缩和在服务器上膨胀时,反之亦然。

Zlib::Inflate.inflate(Base64.decode64(encoded_data))
#=> "some long yaml stringsome long yaml str ... (shortened, as the string is long :)

免责声明:

  • ruby zlib 实现应该与 pako 实现兼容。但我还没有尝试过。
  • 关于字符串大小的数字有点作弊。Zlib 在这里真的很有效,因为字符串重复了很多。现实生活中的数据通常不会重复太多。
于 2013-07-26T14:10:29.860 回答