我有一个Web应用程序(ruby on rails),它发送一些YAML作为隐藏输入字段的值。现在我想减少发送到浏览器的文本的大小。什么是最有效的无损压缩形式,将发送最少的数据?我可以在服务器端产生额外的压缩和解压缩成本。
juzqafwq1#
您可以在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 :)
免责声明:
vdzxcuhz2#
如果您正在使用Rails应用程序,您还可以使用ActiveSupport::Gzip Package 器,它允许使用gzip压缩/解压缩字符串。
ActiveSupport::Gzip
compressed_log = ActiveSupport::Gzip.compress('large string') => "\x1F\x8B\b\x00yq5c\x00\x03..." original_log = ActiveSupport::Gzip.decompress(compressed_log) => "large string"
在后台,compress方法使用Zlib::GzipWriter类来写入gzip文件,类似地,解压缩方法使用Zlib::GzipReader类来读取gzip文件。
Zlib::GzipWriter
Zlib::GzipReader
2条答案
按热度按时间juzqafwq1#
您可以在ruby核心中使用zlib实现来输入/消除数据:
您应该对压缩数据进行base64编码以使其可打印:
稍后,在客户端,您可能会使用pako(javascript的zlib端口)取回数据,这个答案可能有助于实现JS部分。
下面是示例字符串的大小,给予您了解一下它的效果:
当在客户机上压缩而在服务器上膨胀时,情况也是如此。
免责声明:
vdzxcuhz2#
如果您正在使用Rails应用程序,您还可以使用
ActiveSupport::Gzip
Package 器,它允许使用gzip压缩/解压缩字符串。在后台,compress方法使用
Zlib::GzipWriter
类来写入gzip文件,类似地,解压缩方法使用Zlib::GzipReader
类来读取gzip文件。