ruby - 使用 Ruby,如何将二进制数据转换为高度压缩但可读的格式

标签 ruby compression information-theory

我有一些二进制数据,我想将其转换为更易于阅读和复制/粘贴的内容。

二进制数据是这样显示的

?Q?O?,???W%ʐ):?g????????

这很丑陋。我可以将它转换为十六进制:

value.unpack("H*").first

但是因为十六进制只有 16 个字符,所以它不是很压缩。我最终得到了一个长达数百个字符的字符串。

我更喜欢使用字母(大写和小写)、数字和基本符号的格式,以充分利用可能的值。我可以使用什么?

我还更喜欢 Ruby 内置的东西,不需要其他库。不幸的是,我不能要求另一个库,除非它真的广为人知和流行,或者理想地内置到 Ruby 中。

我尝试了 http://apidock.com/ruby/String/unpack 中的内容却找不到任何东西。

最佳答案

一种简单的方法使用 Base64 编码对值进行编码。它与 Hex 编码(即 Base16)非常相似,但使用了更长的字典。

Base64 字符串,如果准备得当,只包含可打印的字符。这有利于复制/粘贴和共享。

第二个好处是它具有 3:4 的编码比,这意味着它相当高效。 3:4 的编码比例意味着输入中每 3 个字节使用 4 个字节进行编码(效率为 75%);十六进制编码是一种效率较低的 1:2 编码比例,或者对于输入的每 1 个字节,使用 2 个字节进行编码(效率为 50%)。

您可以使用 Ruby 标准库 Base64实现编码和解码,像这样:

require "base64"

encoded = Base64.encode64("Taste the thunder!") # <== "VGFzdGUgdGhlIHRodW5kZXIh\n"
decoded = Base64.decode64(encoded)              # <== "Taste the thunder!"

请注意,还有一个(大部分)URL 安全版本,因此您可以在 URL 中的任何位置包含编码值,而无需任何额外的 URL 编码。这将允许您以模糊的方式在 URL 中传递信息,尤其是通常不容易以这种方式传递的信息。

试试这个来编码你的数据:

encoded_url_param = Base64.urlsafe_encode64("cake+pie=yummy!")  # <== "Y2FrZStwaWU9eXVtbXkh"
decoded_url_param = Base64.urlsafe_decode64(encoded_url_param)  # <== "cake+pie=yummy!"

在 URL 中使用 Base64,虽然实际上不是“安全”,但有助于防止窥探您的数据和意图。在 URL 中使用 Base64 值的唯一潜在缺点是 URL 必须保持区分大小写,而某些应用程序不满足该要求。查看Should URL be case sensitive SO 问题以获取更多信息。

关于ruby - 使用 Ruby,如何将二进制数据转换为高度压缩但可读的格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37044446/

相关文章:

compression - 理论:使某些文件变小但不变大的压缩算法?

java(安卓): try compressed I/O and failed

machine-learning - 互信息和预测准确性

ruby - ruby 中字符串中的 gsub ASCII 码字符

ruby - 为什么在使用 savon 进行 ruby​​ soap 通信时将 "wsdl"命名空间插入到操作名称中?

ruby 方法将哈希值转换为字符串

mysql - 检查时间重叠(ruby/mysql)

sql - Postgres 的文本列不喜欢我的 zlib 压缩数据

algorithm - 可压缩性示例